너비가 여러 개인 파일 일괄 이름 바꾸기

너비가 여러 개인 파일 일괄 이름 바꾸기

비슷한 파일이 있어요

file1.txt
file2.txt
file3.txt
...
file11.txt
file12.txt
...
file100.txt
file101.txt
...

다음과 같이 동일한 문자열 너비를 갖도록 이름을 바꾸고 싶습니다.

file001.txt
file002.txt
file003.txt
...
file011.txt
file012.txt
...
file100.txt
file101.txt
...

이를 달성하는 간단한 명령이 있습니까? 예를 들어 Rangerbulkrename을 사용하여 수동으로 이름을 바꾸는 것을 피하고 싶습니다.

답변1

매뉴얼 페이지에서rename(1), 이를 수행하는 예를 확인할 수 있습니다.

EXAMPLES
       Given the files foo1, ..., foo9, foo10, ..., foo278, the commands

              rename foo foo00 foo?
              rename foo foo0 foo??

       will turn them into foo001, ..., foo009, foo010, ..., foo278

따라서 귀하의 경우 간단한 해결책(가장 큰 숫자가 3자리인 경우)은 다음과 같습니다.

rename file file00 file?.txt
rename file file0 file??.txt

실제 명령을 실행하기 전에 rename및 플래그를 추가하여 테스트하고 결과를 확인할 수 있습니다.--no-act / -n--verbose / -v

$ rename -nv file file00 file?.txt
`file1.txt' -> `file001.txt'
`file2.txt' -> `file002.txt'
`file3.txt' -> `file003.txt'
$ rename -nv file file0 file??.txt
`file11.txt' -> `file011.txt'
`file12.txt' -> `file012.txt'

보다 일반적인 솔루션( bash버전 3.0부터 사용 가능):

$ for i in `find ./ -maxdepth 1 -type f -name 'file*.txt'`; \
  do if [[ "$i" =~ file([0-9]*).txt$ ]]; \
    then NUM=$(printf "%03d" "${BASH_REMATCH[1]}"); \
    echo mv --verbose $i $i ./file${NUM}.txt; \
  fi; \
done
mv --verbose ./file1.txt ./file001.txt
mv --verbose ./file2.txt ./file002.txt
mv --verbose ./file3.txt ./file003.txt
mv --verbose ./file11.txt ./file011.txt
mv --verbose ./file12.txt ./file012.txt
mv --verbose ./file100.txt ./file100.txt
mv --verbose ./file101.txt ./file101.txt

echo변경을 수행하려면 제거하세요. 이는 단순한 예일 뿐이며, 파일의 접두사와 접미사를 라인의 패턴으로 변경 if하고 해당 패턴 캡처를 사용하여 $BASH_REMATCH더 복잡한 이름 바꾸기를 수행할 수도 있습니다. 예를 들어:

$ for i in `find ./ -maxdepth 1 -type f`; \
  do if [[ "$i" =~ ^([^0-9]*)([0-9]*).txt$ ]]; \
    then NUM=$(printf "%03d" "${BASH_REMATCH[2]}"); \
    echo mv --verbose $i ${BASH_REMATCH[1]}${NUM}.txt; \
  fi; \
done
mv --verbose ./file1.txt ./file001.txt
mv --verbose ./file2.txt ./file002.txt
mv --verbose ./file3.txt ./file003.txt
mv --verbose ./file11.txt ./file011.txt
mv --verbose ./file12.txt ./file012.txt
mv --verbose ./file100.txt ./file100.txt
mv --verbose ./file101.txt ./file101.txt
mv --verbose ./something1.txt ./something001.txt
mv --verbose ./another02.txt ./another002.txt

물론 printf명령을 수정하여 0 채우기 길이를 3에서 다른 숫자로 변경할 수 있습니다.

답변2

모든 ASCII 십진수 시퀀스가 ​​포함된 파일의 이름을 너비가 3(0 포함)인 파일로 바꾸려면 다음을 사용하세요 zsh.

autoload -Uz zmv
zmv -n '*' '${f//(#m)<->/${(l[3][0])MATCH}}'

( -n결과가 만족스러우면 삭제하여 테스트 실행해 보세요.)

Perl 기반 rename구현(때때로 file-rename, prename또는 라고도 함 perl-rename)과 동일합니다.

rename -n 's/\d+/sprintf "%03d", $&/ge' ./*[0123456789]*

답변3

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

rename -n 's/^file(\d+)\.txt$/sprintf "file%03i.txt", $1/e' file*.txt

regex 수정자는 /erename에게 s/search/replace/ 연산자의 대체 부분을 실행 가능한 Perl 코드로 처리하도록 지시합니다. 이 sprintf기능은 .txt 확장자 앞의 숫자를 0으로 채우는 데 사용됩니다.

또는 임의의 파일 이름 접두사 및 확장자로 일반화할 수 있습니다.

rename -n 's/\A(.*?)(\d+)(\..*)\z/sprintf "%s%03i%s", $1, $2, $3/esm' *

/s정규식 수정 자는 /m스크립트가 모든 파일 이름, 심지어 개행 문자가 포함된 파일 이름에서도 작동하는지 확인하는 데 사용됩니다. \A문자열의 시작 부분에 있는 앵커 포인트와 \z문자열 끝의 앵커 포인트입니다.

-n옵션을 사용하면 시험적으로 실행되므로 실제로 파일 이름을 바꾸지 않고 수행할 작업만 표시됩니다. 요구사항을 충족하는 것으로 확인되면 삭제 -n하거나 로 대체하여 자세한 출력을 얻으세요.-v

관련 정보