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(ベースの実装の1つ)。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)

これら2つの方法のいくつかの同等性は次のとおりです。

  • */ .*:0個以上の文字と一致します。
  • <->/ \d+: 1 つ以上の ASCII 10 進数と一致します。では、一致する数値の範囲を制限zshするためにも使用できます。<1-700>
  • $1、、$2::$3拡張を(...)パターンでキャプチャされたコンテンツに置き換えます。
  • l[3][0]/ printf "%03d"lefパッドの3長さ0

1はrename実際には0以上です。バイト、途中で一部の文字が壊れる可能性が高い。ただし、ここでこれを行うには、東アジアの一部の地域で使用されるBIG5、GBK、GB18030などの文字マップでファイル名をエンコードする必要があります。これには、エンコードに含まれる複数の文字があります]。バイト0xa(改行エンコード)には一致するものはありません。s.

おすすめ記事