맵 파일을 사용하여 배치 파일 이름 바꾸기

맵 파일을 사용하여 배치 파일 이름 바꾸기

다음과 같은 이미지 파일이 많이 있습니다.

a.png, b.png, c.png, etc

다음과 같은 숫자에 대한 파일 이름 매핑이 포함된 파일이 있는 경우(형식을 무시하면 무엇이든 가능):

a=>1
b=>2
c=>3
...

맵 파일을 사용하여 모든 파일의 이름을 일괄적으로 바꾸는 쉬운 방법이 있습니까?

1.png, 2.png, 3.png, etc

유닉스/리눅스 명령을 찾고 있습니다. 나는 매우 간단한 스크립트를 작성할 수 있다는 것을 알고 있지만 다른 기술이 있는지 궁금합니다.

감사해요

답변1

명령 없음모든 것;이것이 스크립트 가능한 쉘을 갖는 요점입니다.

while read -r old new; do
    mv "$old.png" "$new.png"
done < map.txt

답변2

sed가 없으면 bash에서 다음 대체를 수행할 수 있습니다.

for line in  $(< patterns) ; do  echo "Pattern: " $line " char: "  ${line/=>*/} " nr: " ${line/*=>/}; done 

("패턴"은 a=>1 등의 파일이 됩니다) 결과는 다음과 같습니다.

for line in  $(< patterns) ; do
  c=${line/=>*/}
  n=${line/*=>/}
  mv $c.png $n.png 
done 

bash 맨페이지에는 "String Substitution" 아래에 이 옵션과 기타 흥미로운 옵션이 나열되어 있습니다.

어쩌면 Perls rename도 흥미로운 옵션일 수 있습니다. 스키마를 사용하여 대규모 이름 변경이 가능합니다.

rename 's/^a/1/' a*png 

우분투에서는 Perl 패키지인 afaik이 함께 제공됩니다.

답변3

펄 방식은 다음과 같습니다.

cat mapfile | perl -e 'my$h={eval join(",",<>)};while (($k,$v)=each%$h){`mv $k.png $v.png`}'

두 번째 시도:

perl -nle '(@a=map{s/^\s+//;s/\s+$//;s/'/\\'/g;$_}split/\s*=>\s*/,$_,2)and`mv \'$a[0].png\' \'$a[1].png\'`'

적용 대상:

Someone's $tupid file name    =>   renamed by "simple" script?!

관련 정보