파일 이름에 이미 숫자가 있는 파일 이름 바꾸기

파일 이름에 이미 숫자가 있는 파일 이름 바꾸기

water-frames0.gro에서 water-frames201.gro까지 다음 이름의 파일이 있습니다.

water-frames0.gro  water-frames119.gro  water-frames138.gro  water-frames157.gro
water-frames116.gro  water-frames135.gro  water-frames154.gro

터미널에서 파일이 올바르게 정렬되도록 숫자 앞에 0과 대시를 추가하려면 어떻게 해야 합니까? 수천 개의 파일 이름을 처리하는 데 필요하므로 추가로 0을 추가하는 것이 유용할 것 같습니다.

새 파일 이름이 다음과 같다고 생각합니다.

water-frames-0000.gro  water-frames-0119.gro  water-frames-0138.gro  water- 
frames-0157.gro water-frames-0116.gro  water-frames-0135.gro  water-frames-0154.gro

이름 바꾸기를 사용해 보고 이전 질문을 살펴봤지만 적응할 수 있는 내용을 찾을 수 없었습니다.

감사합니다,

답변1

Perl rename유틸리티를 사용하십시오:

$ rename -n 's/(\d+)(\.gro)$/sprintf "-%04i%s", $1, $2/e' ./*.gro
rename(./water-frames0.gro, ./water-frames-0000.gro)
rename(./water-frames116.gro, ./water-frames-0116.gro)
rename(./water-frames119.gro, ./water-frames-0119.gro)
rename(./water-frames135.gro, ./water-frames-0135.gro)
rename(./water-frames138.gro, ./water-frames-0138.gro)
rename(./water-frames154.gro, ./water-frames-0154.gro)
rename(./water-frames157.gro, ./water-frames-0157.gro)

이는 .gro 앞의 숫자를 $1로 캡처하고 .gro 자체를 $2로 캡처하므로 대체 연산자의 오른쪽(RHS)에서 사용할 수 있습니다 s///. /eRHS를 Perl 코드로 평가하기 위해 이름 바꾸기를 유발하는 Perl 정규 표현식에 대한 수정자입니다 . man perlre자세히보다. sprintf리터럴로 시작 -하고 $1 및 $2를 0으로 채워진 4자리 정수( %04i) 및 문자열( %s)로 형식화합니다.

file-rename참고 1: Perl 이름 바꾸기는 , perl-rename또는 라고도 합니다 prename. 기능과 명령줄 옵션이 완전히 다르고 호환되지 않는 rename유틸리티와 혼동 하지 마십시오.util-linux

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

참고 3: perl rename은 파일 이름을 명령줄이나 표준 입력(새 줄 또는 NUL로 구분된 파일 이름)의 인수로 사용할 수 있습니다. 이름 바꾸기 옵션은 -0파이프 입력과 잘 어울립니다 find ... -print0. 에서도 잘 작동합니다 find ... -exec rename ... {} +.

답변2

그리고 zsh:

autoload -Uz zmv

일괄 이름 바꾸기 기능 자동 로드( 에 가장 적합 ~/.zshrc)

zmv -n '(water-frames)(<0-999>)(.gro)' '$1-${(l[4][0])2}$3'

만족스러우면 삭제하세요 -n.

관련 정보