패턴 이름을 딴 파일이 포함된 디렉터리가 있습니다.
[HorribleSubs] One Piece - 01 [1080p].mkv
[HorribleSubs] One Piece - 02 [1080p].mkv
최대 700개의 파일이 있을 수 있습니다.
이 파일의 이름을 다음으로 바꾸고 싶습니다.
One Piece 001.mkv
One Piece 002.mkv
등. 저는 Linux를 처음 사용하는데 이 문제를 해결하는 데 도움이 필요합니다.
답변1
zsh
쉘 사용 (안타깝게도 Ubuntu에는 기본적으로 설치되지 않으므로 apt install zsh zsh-doc
다음으로 실행해야 함 root
):
$ autoload -Uz zmv
$ zmv -n '\[*\] (* - )(<->) \[<->p\](.mkv)' '$1${(l[3][0])2}$3'
mv -- '[HorribleSubs] One Piece - 01 [1080p].mkv' 'One Piece - 001.mkv'
mv -- '[HorribleSubs] One Piece - 02 [1080p].mkv' 'One Piece - 002.mkv'
( -n
결과에 만족하면 제거(테스트 실행)).
또는 패키지의 aka 명령과 동일합니다 rename
(기반 구현 중 하나).file-rename
rename
perl
rename
$ rename -n 's{^\[.*\] (.* - )(\d+) \[\d+p\](\.mkv)\z}{
sprintf "%s%03d%s", $1, $2, $3}se' \[*.mkv
rename([HorribleSubs] One Piece - 01 [1080p].mkv, One Piece - 001.mkv)
rename([HorribleSubs] One Piece - 02 [1080p].mkv, One Piece - 002.mkv)
이 두 가지 방법의 일부 동등성은 다음과 같습니다.
*
/.*
: 0개 이상의 문자와 일치합니다.<->
/\d+
: 하나 이상의 ASCII 십진수와 일치합니다. 에서는 일치하는 숫자의 범위를 제한zsh
하는 데 사용할 수도 있습니다 .<1-700>
$1
,$2
,$3
: 확장을(...)
패턴에서 캡처된 해당 콘텐츠로 바꿉니다.l[3][0]
/printf "%03d"
:l
ef-패드의3
길이0
.
1은 rename
실제로 0 이상입니다.바이트, 중간에 일부 문자가 깨질 가능성이 높습니다. 하지만 여기서 이런 일이 발생하려면 동아시아의 일부 지역에서 사용되는 BIG5, GBK, GB18030과 같은 문자 맵에서 파일 이름을 인코딩해야 합니다. 여기에는 인코딩에 가 포함된 여러 문자가 있습니다 ]
. 바이트 0xa(개행 인코딩)에는 일치하는 항목이 없습니다.s
.
답변2
rename
파일이 모두 다음과 같이 Ubuntu에서 사용할 수 있는 정확한 패턴을 따르는 경우 :
$ rename -n 's/.*- (\d+).*/"One Piece " . sprintf("%.3d",$1) . ".mkv"/e' *mkv
[HorribleSubs] One Piece - 01 [1080p].mkv -> One Piece 001.mkv
[HorribleSubs] One Piece - 02 [1080p].mkv -> One Piece 002.mkv
올바른 것으로 보이면 -n
실제로 파일 이름을 바꾸는 옵션을 제거하십시오.