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.ul
rename
/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