디렉토리에 있는 모든 파일의 이름에 숫자를 더하거나 뺍니다.

디렉토리에 있는 모든 파일의 이름에 숫자를 더하거나 뺍니다.

png예를 들어 디렉토리에 숫자 및 이라는 이름의 파일이 많이 있습니다 .jpg0100.png

  • 10002.png예를 들어, 이름을 덮어쓰지 않고 별도로 이름을 추가하려면 어떻게 해야 합니까 0003.png?0001.png0002.png

  • 2이름에서 가 되지 않도록 어떻게 0100.png이름 을 빼야 합니까 ?098.png0098.png

관련된https://stackoverflow.com/questions/26770060/subtracting-a-number-from-the-names-of-all-the-files-in-a-directory, 하지만 여기서는 더 어렵습니다.

답변1

이 경우 임시 디렉터리를 사용하게 될 수도 있습니다.

for file in [[:digit:]]*.png; do
    echo mv $file tmp/$(printf %04d $((10#${file%.png}+1))).png
done

중요한 부분은 bash가 이를 just 로 10#N해석하도록 강제하는 것 입니다 . 그렇지 않으면 선행 0이 8진수를 나타냅니다.000NN

예를 들어:

$ touch 0001.png 0002.png 0010.png 0020.png 0100.png 0200.png
$ for file in [[:digit:]]*.png; do echo mv $file tmp/$(printf %04d $((10#${file%.png}-1))).png; done
mv 0001.png tmp/0000.png
mv 0002.png tmp/0001.png
mv 0010.png tmp/0009.png
mv 0020.png tmp/0019.png
mv 0100.png tmp/0099.png
mv 0200.png tmp/0199.png

답변2

(1) 용액

파일 번호별로 파일을 정렬하고 가장 높은 번호의 파일부터 이름을 바꿉니다. 이렇게 하면 충돌이 불가능해집니다.

ls *.png | sort -rn | while read ...; do ... mv ...; done

(2)의 해결책

비트 수를 결정한 다음(비트 수가 모든 파일에 대해 다른 경우) printf해당 길이를 유지하는 데 사용합니다.

printf %04d.png 98
0098.png

답변3

펄 사용하기rename:

-2:

$ rename -n 's@\b\d+\b@sprintf("%04d", $& - 2)@e'  0100.png
0100.png -> 0098.png

+1:

$ rename -n 's@\b\d+\b@sprintf("%04d", $& + 1)@e'  0001.png 0002.png
0001.png -> 0002.png
0002.png -> 0003.png

-n테스트가 유효하면 제거할 수 있습니다(모의 실행 모드 스위치).

경고하다이 작업을 수행할 수도 있고 수행하지 못할 수도 있는 같은 이름의 다른 도구가 있으므로 주의하세요.

다음 명령을 실행하면 ( linux)

$ file $(readlink -f $(type -p rename))

이런 결과가 나왔어요

.../rename: Perl script, ASCII text executable

그렇다면 이것이 올바른 도구인 것 같습니다 =)

그렇지 않은 경우 이를 기본값으로 설정하고(일반적으로 이미 적용되어 있음) Debian다음과 같이 파생시킵니다 Ubuntu.

$ sudo update-alternatives --set rename /path/to/rename

(명령어의 경로로 바꿉니다 /path/to/rename.perl's rename


이 명령이 없으면 패키지 관리자를 검색하여 설치하거나수동으로 수행


마지막으로 이 도구는 원래 Perl의 아버지인 Larry Wall이 작성했습니다.

관련 정보