png
예를 들어 디렉토리에 숫자 및 이라는 이름의 파일이 많이 있습니다 .jpg
0100.png
1
0002.png
예를 들어, 이름을 덮어쓰지 않고 별도로 이름을 추가하려면 어떻게 해야 합니까0003.png
?0001.png
0002.png
2
이름에서 가 되지 않도록 어떻게0100.png
이름 을 빼야 합니까 ?098.png
0098.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진수를 나타냅니다.000N
N
예를 들어:
$ 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이 작성했습니다.