どうすればこれを置き換えることができますか
[www.Example.com]Name-episode-77.mp4
FGBs episode 3 dks.mp4
に
HxH 077.mp4
HxH 003.mp4
*ファイル名は正確なパターンに従っていません
このワンライナーは、サンプルデータに対して機能します。
_for i in *; do echo "$i";mv "$i" $(echo "$i" | Perl -ne '($num)=$_=~/(\d+).*\.mp4/; print "HxH",sprintf("%03d",$num),".mp4","\n"'); done;
_
説明:
_for i in *;
do
echo "$i";
mv "$i" $(echo "$i" | Perl -ne '($num)=$_=~/(\d+).*\.mp4/; print "HxH",sprintf("%03d",$num),".mp4","\n"');
done;
_
_for i in *;do
_->現在のディレクトリ内のすべてのファイルをループします
_echo "$i";
_->現在のファイルを書き込む(進行状況/ロギングを参照)mv "$i" $(echo "$i" | Perl -ne '($num)=$_=~/(\d+).*\.mp4/; print "HxH",sprintf("%03d",$num),".mp4","\n"');
->名前変更コマンド(Perlコマンドの出力の元の名前)Perlコマンドは、指定されたファイル名から数字を抽出し、先頭に0が付いた数字である「HxH」と「.mp4」を出力します。
重要な注意点:
指定されたコマンドは、指定した2つのサンプル入力で機能します。実際のファイルに適用する前に、必ずテストする必要があります。したがって、コマンドから_mv "$i"
_を削除することをお勧めします。次に、名前を検証できます。
もう1つの可能性は、rename
(Ubuntuに付属する標準バージョンであるPerlバージョン)と正規表現(RE)を使用することです。
_rename -vn 's/.*?([0-9]+).*/sprintf("HxH %03d.mp4", $1)/e' *.mp4
_
ステップバイステップ:
_rename -vn
_は(_-v
_)名前を変更すると、名前を変更せずに実行します(_-n
_);
すべての名前について、最初のREを_/
_で区切った2番目の文字列に置き換えます(s
)。
最初のREは、貪欲でない方法(_.*?
_)で0個以上の文字に一致し、その後に1つ以上の数字(_[0-9]+
_)が続き、その後に何でも一致します。括弧(_(...)
_)のおかげで、一致する数字は最初のグループに保存されます。
2番目の文字列はPerlコマンドsprintf("HxH %03d", $1)
に展開されます。ここで、_$1
_は上記で一致した最初のグループです。
e
コマンドのフラグs
は、置換式を実行して結果を使用することを示しているので、 sprintf
が実行され、先頭にゼロが付いたサイズ3のフィールドに_$1
_の数値が出力されます(_"%03d"
_);
最後に、rename
コマンドを_.mp4
_(_*.mp4
_)で終わるすべてのファイルに適用します。
見る:
_% ls
FGBs episode 3 dks.mp4 [www.Example.com]Name-episode-77.mp4
% rename -vn 's/.*?([0-9]+).*/sprintf("HxH %03d.mp4", $1)/e' *.mp4
FGBs episode 3 dks.mp4 renamed as HxH 003.mp4
[www.Example.com]Name-episode-77.mp4 renamed as HxH 077.mp4
_
これは単なるテスト実行であることに注意してください。名前の変更は元に戻せません...実際に実行してみましょう:
_% rename -v 's/.*?([0-9]+).*/sprintf("HxH %03d.mp4", $1)/e' *.mp4
FGBs episode 3 dks.mp4 renamed as HxH 003.mp4
[www.Example.com]Name-episode-77.mp4 renamed as HxH 077.mp4
% ls
HxH 003.mp4 HxH 077.mp4
_
正規表現は本当に強力です。
最初の数字のセットのみが使用されることに注意してください。
_% touch "Another serie 2 ep 34.mp4"
% rename -vn 's/.*?([0-9]+).*/sprintf("HxH %03d.mp4", $1)/e' *.mp4
Another serie 2 ep 34.mp4 renamed as HxH 002.mp4
_
それを避けるために...例えば研究 https://stackoverflow.com/questions/5320525/regular-expression-to-match-last-number-in-a-string そして注意してください「mp4」の「4」.。
さらに、名前にnoの数字が含まれていると、失敗します---以下の@kosのコメントを参照してください。