Ubuntu에서 많은 수의 파일 이름을 일괄적으로 바꾸는 방법은 무엇입니까?

Ubuntu에서 많은 수의 파일 이름을 일괄적으로 바꾸는 방법은 무엇입니까?

패턴 이름을 딴 파일이 포함된 디렉터리가 있습니다.

[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-renamerenameperlrename

$ 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": lef-패드의 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실제로 파일 이름을 바꾸는 옵션을 제거하십시오.

관련 정보