web-dev-qa-db-ja.com

複数のファイルの名前を変更すると、すべての文字が削除されます

どうすればこれを置き換えることができますか

[www.Example.com]Name-episode-77.mp4
FGBs episode 3 dks.mp4 

HxH 077.mp4
HxH 003.mp4

*ファイル名は正確なパターンに従っていません

したい :-

  • すべての文字と記号を削除します
  • 3から003までのフォーマット番号
  • ファイル名の先頭に文字列を追加します
2
TarekkMA

このワンライナーは、サンプルデータに対して機能します。

_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"_を削除することをお勧めします。次に、名前を検証できます。

2
Wayne_Yux

もう1つの可能性は、rename(Ubuntuに付属する標準バージョンであるPerlバージョン)と正規表現(RE)を使用することです。

_rename -vn 's/.*?([0-9]+).*/sprintf("HxH %03d.mp4", $1)/e' *.mp4
_

ステップバイステップ:

  1. _rename -vn_は(_-v_)名前を変更すると、名前を変更せずに実行します(_-n_);

  2. すべての名前について、最初のREを_/_で区切った2番目の文字列に置き換えます(s)。

  3. 最初のREは、貪欲でない方法(_.*?_)で0個以上の文字に一致し、その後に1つ以上の数字(_[0-9]+_)が続き、その後に何でも一致します。括弧(_(...)_)のおかげで、一致する数字は最初のグループに保存されます。

  4. 2番目の文字列はPerlコマンドsprintf("HxH %03d", $1)に展開されます。ここで、_$1_は上記で一致した最初のグループです。

  5. eコマンドのフラグsは、置換式を実行して結果を使用することを示しているので、 sprintfが実行され、先頭にゼロが付いたサイズ3のフィールドに_$1_の数値が出力されます(_"%03d"_);

  6. 最後に、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のコメントを参照してください。

2
Rmano