파일 이름 바꾸기 루프가 제대로 작동하지 않습니다.

파일 이름 바꾸기 루프가 제대로 작동하지 않습니다.

폴더에는 32개의 *.dds 파일이 있습니다.

pic-0.dds, pic-1.dds, pic-2.dds,...,pic-31.dds

이름을 다음과 같이 바꾸고 싶습니다.

015040.dds, 015041.dds, 015042.dds,...,0150471.dds.

다음 스크립트를 사용하려고 합니다.

#!/bin/bash
j=39;
for i in *.dds;
do let j+=1;
mv $i 0150$j.dds;
done

pic-0.dds이름이 으로 바뀌었지만 오류 015040.dds가 발생했습니다. 즉, 이름이 등 pic-1.dds으로 바뀌지 않았습니다 .015041.dds

다음과 같은 다른 이름 바꾸기에 대한 공통 스크립트를 원합니다.

pic-40.dds, pic-41.dds, pic-42.dds,...,pic-53.dds

도착하다:

0191.dds, 0192.dds, 0193.dds,...,0204.dds

답변1

문제는 pic-*.dds대시 뒤의 숫자가 아닌 문자 순서로 파일을 정렬하는 것입니다.

0이 문제를 해결하는 한 가지 가능한 방법은 파일 이름 뒤에 대시를 삽입하는 것입니다 pic-{0..9}.dds. 그러면 파일을 알파벳순으로 나열하는 것은 숫자순으로 정렬하는 것과 같으며 모든 것이 잘 작동합니다.

이미 사용한 것과 유사한 루프를 사용하여 이 작업을 수행할 수 있습니다.

for f in pic-?.dds ; do
    mv "$f" pic-0"${f#pic-}"
done

이것은${f#pic-}매개변수 대체#, 이 기호는 변수 $f 값의 시작 부분에서 문자열을 삭제하도록 쉘에 지시합니다 .pic-

답변2

for루프가 필요 하지 않으며 renamePerl을 사용하여 수행할 수 있습니다.

Perl 유틸리티는 배포판에 따라 , , 또는 rename라고도 합니다 . 기능과 명령줄 옵션이 완전히 다르고 호환되지 않는 유틸리티와 혼동 하지 마십시오. Perl을 사용하면 임의로 복잡한 Perl 코드를 사용하여 파일 이름을 바꿀 수 있지만 파일 이름에 대해 간단하고 유사한 작업을 수행하는 데 가장 일반적으로 사용됩니다 .file-renameperl-renameprenamerenameutil-linuxrenameseds/search/replace/

예를 들어:

$ rename -n 's/pic-(\d+)\.dds$/sprintf("015%03i.dds",$1+40)/e' *.dds
rename(pic-0.dds, 015040.dds)
rename(pic-10.dds, 015050.dds)
rename(pic-11.dds, 015051.dds)
rename(pic-12.dds, 015052.dds)
rename(pic-13.dds, 015053.dds)
rename(pic-14.dds, 015054.dds)
rename(pic-15.dds, 015055.dds)
rename(pic-16.dds, 015056.dds)
rename(pic-17.dds, 015057.dds)
rename(pic-18.dds, 015058.dds)
rename(pic-19.dds, 015059.dds)
rename(pic-1.dds, 015041.dds)
rename(pic-20.dds, 015060.dds)
rename(pic-21.dds, 015061.dds)
rename(pic-22.dds, 015062.dds)
rename(pic-23.dds, 015063.dds)
rename(pic-24.dds, 015064.dds)
rename(pic-25.dds, 015065.dds)
rename(pic-26.dds, 015066.dds)
rename(pic-27.dds, 015067.dds)
rename(pic-28.dds, 015068.dds)
rename(pic-29.dds, 015069.dds)
rename(pic-2.dds, 015042.dds)
rename(pic-30.dds, 015070.dds)
rename(pic-31.dds, 015071.dds)
rename(pic-3.dds, 015043.dds)
rename(pic-4.dds, 015044.dds)
rename(pic-5.dds, 015045.dds)
rename(pic-6.dds, 015046.dds)
rename(pic-7.dds, 015047.dds)
rename(pic-8.dds, 015048.dds)
rename(pic-9.dds, 015049.dds)

그러면 파일 이름의 숫자를 캡처 pic-*.dds하고 40에 추가하여 최종 파일 이름을 만듭니다. 바꾸기 작업에서는 s/search/replace/Perl /e수정자를 사용하여 Perl 코드로 오른쪽 바꾸기를 수행합니다. 이 sprintf함수는 계산 형식이 3비트 너비의 제로 패딩된 문자열( %03i)임을 보장합니다.

  • 이는 파일 이름이 표시되는 순서에 관계없이 작동합니다. 증분 카운터를 사용하지 않고 pic-(\d+).dds$파일 이름에서 기존 숫자를 가져와 40을 추가합니다.
  • 패턴과 일치하지 않는 파일 이름은 변경되지 않습니다.
  • perl rename은 기존 파일 이름을 덮어쓰지 않습니다( -f이 옵션을 사용하여 강제로 사용하지 않는 한).

위 예의 옵션을 사용하면 -n연습 실행이 가능하므로전시하다실제로 파일 이름을 바꾸지 않고 수행할 작업입니다. 요구 사항을 충족하는 것으로 확인되면 삭제 -n하거나 자세한 출력으로 바꿉니다.-v

관련 정보