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///
. /e
RHS를 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
.