親フォルダと同じ名前でファイル名を変更する方法

親フォルダと同じ名前でファイル名を変更する方法

movies多くのサブフォルダを含むUbuntuというフォルダがあります。

各サブフォルダには1つのmp4ファイルが含まれており、他のファイル(jpg、srt)を含めることができます。

各サブフォルダのタイトル形式は次のとおりです。

My Subfolder 1 (2001) Bla Bla
My Subfolder 2 (2000) Bla
My Subfolder 3 (1999)

mp4ファイルの名前を親フォルダと同じに変更しますが、年とblablaを除外する方法は?

たとえば、上記のサブフォルダのmp4は次のようになります。

My Subfolder 1.mp4
My Subfolder 2.mp4
My Subfolder 3.mp4

mp4をサブフォルダに保存したいです。名前のみが変更されます。年は常に括弧内にあります。

答え1

bashソリューションは次のとおりです。

cd movies
for mp4 in */*.mp4
do
  if [[ $mp4 =~ ^(.*)\ \( ]]
  then
    echo mv -- "$mp4" ...to... "${mp4%%/*}/${BASH_REMATCH[1]}".mp4
  fi
done

これは、「movies」のすべてのサブディレクトリにあるすべてのmp4ファイルを繰り返し、パターンマッチングテストを適用します。一致する場合:

  • ^- 最初から
  • (.*)- 好きなだけ文字をキャプチャして保存します。
  • \ \(- 後ろに空白と開く括弧が続きます。

一致が成功した場合は、ディレクトリ内の予想されるパターンのmp4ファイルを見つけました。 Bashは括弧で囲まれた一致を$BASH_REMATCH配列変数に格納するため、mv元のファイル名と組み合わせた新しい名前を使用して呼び出します。

  • ${mp4%%/*}元のディレクトリ名
  • // - ディレクトリ区切り記号
  • ${BASH_REMATCH[1]}".mp4- 上記で保存した部分、サフィックスを含む.mp4

結果が正しい場合echo...to...部分を削除します。

答え2

perl名前変更ユーティリティを使用してください。

rename 's/\(\d\d\d\d\)//' */*.mp4

テストを実行して結果を確認するには、-n(別名--nono)オプションを使用します。

rename -n 's/\(\d\d\d\d\)//' */*.mp4

Debian(およびUbuntuなど)では、Perlベースの名前変更がfile-renameパッケージにあります。prenameまたはと呼ぶこともできますfile-rename

しかし、この名前変更バージョンの非常に便利な機能は、ファイル名のスタイルをsed変更するのは簡単ですが、実際に変更されたPerlコードを使用してファイル名を変更できることtrです。複雑なスクリプトも同様です。$_

マニュアルページから:

rename最初の引数で指定された規則に従って指定されたファイル名を変更します。引数は、ファイル名を指定するPerl文字列の少なくとも一部を変更するとperlexpr予想されるPerl式です。$_与えられたファイル名が式によって変更されない場合、名前は変更されません。コマンドラインにファイル名が指定されていない場合は、標準入力からファイル名を読み込みます。

たとえば、拡張子を削除するために「*.bak」に一致するすべてのファイルの名前を変更するには、次のように言うことができます。

rename 's/\.bak$//' *.bak

大文字の名前を小文字の名前に変換するには、次を使用できます。

rename 'y/A-Z/a-z/' *

パッケージに含まれるバージョン(通常は名前付き)renameを含む、まったく異なるコマンドラインオプションとパラメータを持つ異なるバージョンがあることに注意してください。使用する前に、どのバージョンをインストールしたかを確認することが重要です。より正確には、どのバージョンが呼び出されるかシンボリックリンクされているかを確認することが重要です。util-linux/usr/bin/rename.ulrename/usr/bin/rename

Debian、Ubuntu、および関連システムでは、次のことを確認できますupdate-alternatives

# update-alternatives --display rename
rename - auto mode
  link best version is /usr/bin/file-rename
  link currently points to /usr/bin/file-rename
  link rename is /usr/bin/rename
  slave rename.1.gz is /usr/share/man/man1/rename.1.gz
/usr/bin/file-rename - priority 70
  slave rename.1.gz: /usr/share/man/man1/file-rename.1p.gz

関連情報