数字以外のすべてを削除して複数のファイルの名前を変更するには?

数字以外のすべてを削除して複数のファイルの名前を変更するには?

次のようにファイル名を変更したいと思います。

SL Benfica vs. SC Beira-Mar 136.mp4
SL Benfica vs. SC Beira-Mar 137.mp4
SL Benfica vs. SC Beira-Mar 138.mp4
SL Benfica vs. SC Beira-Mar Jogo 074.mp4
SL Benfica vs. SC Beira-Mar Jogo 082.mp4
SL Benfica vs. SC Beira-Mar Jogo 112.mp4

しかし、これは

for f in *.mp4; do echo mv "$f" "${f//[^0-9]/}.mp4"; done

最後に「4」を追加します。

1364.mp4
1374.mp4
1384.mp4
0744.mp4
0824.mp4
1124.mp4

「mp4」の「4」と混同されたようです。この問題をどのように解決できますか?

答え1

.mp4置き換える前にサフィックスを削除してください。

for f in *.mp4; do
  fname=${f%.mp4}
  mv -- "$f" "${fname//[^0-9]}.mp4"
done

--ファイル名がaで始まる場合に備えて追加および-削除しましたecho

答え2

あなたは正しいです。4表示されるのはmp4拡張機能からのものです。その理由は、あなたが扱っているからです。いっぱい${f//[^0-9]/}その.mp部分を含むファイル名ステートメントから数字以外の文字をすべて削除し、末尾の4文字を保持します。

sed次の目的で使用できます。

for f in *.mp4; do
  newname="$(sed 's/^[^0-9]*//' <<< "$f")"
  mv "$f" "$newname"
done

しかし、テストしてみてください(あなたの投稿で読んだようにはっきりとしたように)。

答え3

あなたを使用すると、prename次のようなものを実行できます

prename 's/^\D*//' *.mp4

メモ:

  • \D 数字ではありません
  • ^\D*ファイル名の先頭に数字以外のシーケンス
  • s/^\D*//最初に数字以外のものを削除し、名前を変更します。

Ubuntuなどの一部のLinuxディストリビューションではこのコマンドと呼ばれ、renameArchなどの他のディストリビューションではこのコマンドが呼ばれますperl-rename

関連情報