다음과 같은 파일 목록이 있습니다.
pairs10_10.mp3
pairs10_11.mp3
pairs10_12.mp3
pairs10_13.mp3
pairs10_14.mp3
pairs10_15.mp3
pairs10_16.mp3
pairs10_17.mp3
pairs10_18.mp3
pairs10_19.mp3
pairs10_1.mp3
pairs10_2.mp3
pairs10_3.mp3
pairs10_4.mp3
pairs10_5.mp3
pairs10_6.mp3
pairs10_7.mp3
pairs10_8.mp3
pairs10_9.mp3
pairs1_10.mp3
나중에 정렬할 때 올바른 순서로 정렬되도록 다음과 같은 것을 얻고 싶습니다.
pairs10_10.mp3
pairs10_11.mp3
pairs10_12.mp3
pairs10_13.mp3
pairs10_14.mp3
pairs10_15.mp3
pairs10_16.mp3
pairs10_17.mp3
pairs10_18.mp3
pairs10_19.mp3
pairs10_01.mp3
pairs10_02.mp3
pairs10_03.mp3
pairs10_04.mp3
pairs10_05.mp3
pairs10_06.mp3
pairs10_07.mp3
pairs10_08.mp3
pairs10_09.mp3
pairs01_10.mp3
방금 명령에 대해 배웠지 rename
만 이 이름을 바꾸는 방법을 모르겠습니다.
답변1
Perl rename
명령을 사용하십시오.
rename 's/([0-9]+)_([0-9]+)/sprintf("%02d_%02d",$1,$2)/e' *.mp3
수정 e
자는s
대체 연산자대체가 보간된 문자열이 아닌 Perl 표현식임을 의미합니다. %02d
함수 형식sprintf
필요에 따라 앞에 0을 추가하여 두 자리 숫자로만 정수 형식을 지정합니다.
또는 zsh 및 해당 항목을 사용하십시오.numeric_glob_sort
옵션. 그러나 이는 zsh가 글로빙 작업을 수행하는 경우에만 작동합니다(그림 참조 play pairs*.mp3
).
답변2
POSIX:
for f in *;do x=${f#pairs};y=${f#*_};mv $f pairs_$(printf %02d_%02d ${x%_*} ${y%.mp3}).mp3;done
지쉬어:
autoload zmv;zmv 'pairs(*)_(*).mp3' 'pairs${(l:2::0:)1}_${(l:2::0:)2}.mp3'
답변3
결국 이름 바꾸기 명령과 함께 다단계 프로세스를 사용하게 되었습니다. 아마도 다음과 같이 단순화될 수 있습니다.
rename 's/(pairs)([0-9])_/$1Z$2_/' *.mp3
rename 's/(_)([0-9])\./$1Z$2\./' *.mp3
rename 's/Z/0/' *.mp3
rename 's/Z/0/' *.mp3
($1과 $2는 첫 번째 부분의 괄호를 참조)
("0"은 "$1"과 혼동될 수 있으므로 "Z"는 자리 표시자일 뿐입니다.)
아이디어는 다음에서 나온다https://unix.stackexchange.com/a/147912/86521