고정 길이로 이름을 바꾸는 방법

고정 길이로 이름을 바꾸는 방법

0-n.jpg예를 들어 1~500이라는 이름의 파일이 있습니다 .n

문제는 Windows를 사용하는 일부 사람들이 앞에 0을 사용하지 않는다는 것입니다 ls.

0-100.jpg
0-101.jpg
...
0-10.jpg
...
0-199.jpg
0-19.jpg
0-1.jpg

ls그래서 결과가 다음 과 같을 수 있도록 앞에 0을 삽입하도록 이름을 바꾸고 싶습니다.

0-001.jpg
0-002.jpg
...
0-100.jpg
...
0-499.jpg
0-500.jpg

즉, 모든 파일이 동일한 파일 이름 길이를 갖기를 원합니다.

나는 노력했다이 솔루션하지만 다음과 같은 일련의 오류가 발생합니다.

bash: printf: 0-99: invalid number

답변1

시스템에 Perl 기반 rename명령이 있는 경우 다음과 같은 작업을 수행할 수 있습니다.

rename -- 's/(\d+)-(\d+)/sprintf("%d-%03d",$1,$2)/e' *.jpg

-v(verbose) 및 (no action) 옵션을 사용하여 -n테스트합니다 .

$ rename -vn -- 's/(\d+)-(\d+)/sprintf("%d-%03d",$1,$2)/e' *.jpg
0-10.jpg renamed as 0-010.jpg
0-19.jpg renamed as 0-019.jpg
0-1.jpg renamed as 0-001.jpg

답변2

zsh쉘이 있는 경우 다음을 수행할 수 있습니다.

zmv '([0-9])-([0-9]##).(jpg)' '$1-${(l:3::0:)2}.$3'

시험

touch 0-1.jpg
touch 0-23.jpg
touch 0-345.jpg
touch 0-6.jpg
touch 0-05.jpg

셸을 으로 변경합니다 . 로드되지 않는 zsh경우 이렇게 할 수 있습니다 .zmvautoload zmv

이제 -n명령에 플래그를 추가하여 명령을 실행할 때 어떤 일이 발생하는지 zmv확인할 수 있습니다 . zmv명령을 실행하고 있습니다.

zmv -n '([0-9])-([0-9]##).(jpg)' '$1-${(l:3::0:)2}.$3'

출력은,

zmv -n '([0-9])-([0-9]##).(jpg)' '$1-${(l:3::0:)2}.$3'
mv -- 0-05.jpg 0-005.jpg
mv -- 0-1.jpg 0-001.jpg
mv -- 0-23.jpg 0-023.jpg
mv -- 0-6.jpg 0-006.jpg

파일 이름이 올바르게 바뀌었다면 플래그를 제거할 수 있습니다 -n.

인용하다

이 문제에 대한 의심을 명확히 해준 사용자 Gnouc에게 감사드립니다. 이 솔루션을 얻기 위한 또 다른 질문으로 게시했으며 Gnouc의 답변에 대한 링크는 다음과 같습니다.이것하나.

답변3

"이름 바꾸기:"가 없는 경우 다른 해결 방법

for file in *.jpg; do
   [ -f "$file" ] || continue  #skips if no jpg file present in current dir
   echo "${file}" | awk -F'[-.]' '
      {   new=sprintf("%03d",$2); 
          print "echo TESTING mv ", $0," ",$1"-"new"."$3 
      }'
done | bash

(편집: | bash파일당 한 번이 아니라 한 번만 호출되도록 이동했습니다. 그리고 이 빠른 루프는 "이상한 파일 이름"에 적합하지 않지만 추가로 정리할 수 있습니다(공백이 있는 파일을 처리하기 위해 등).

원하는 작업이 수행되고 있다고 확신하면 해당 두 단어를 제거하여 echo TESTING실제로 수행하십시오.mv ...

답변4

또 다른 접근 방식이 있습니다. 파일의 특정 하위 집합의 이름만 바꾸면 되고 해당 파일이 무엇인지 이미 알고 있으므로 해당 파일을 나열하고 이름을 바꾸십시오.

for i in {1..99}; do mv -- 0-$i.jpg 0-$(printf '%03d\n' $i).jpg; done

그러면 1부터 99까지의 숫자가 나열되고 각 값은 $i이미 올바르게 이름이 지정되어 있으므로 나머지 값은 신경쓰지 않아도 됩니다. 그런 다음 0-$i.jpg채워진 버전으로 이름을 바꿀 수 있습니다 . 길이가 3자 미만인 경우 이 printf %03d명령어는 왼쪽에 0이 추가된 숫자를 인쇄합니다. 결과적으로 문제가 있는 모든 파일의 이름이 변경됩니다.

관련 정보