1. ホーム
  2. bash

[解決済み] macOSのターミナルでファイル名を一括変更するには?

2022-06-18 12:42:29

質問

私は、一連のファイル名を持つフォルダを持っています。

prefix_1234_567.png
prefix_abcd_efg.png

私は 一括削除 というように、アンダースコアと中身の1つを削除したいのですが、出力は以下のようになります。

prefix_567.png
prefix_efg.png

関連性はあるが、完全な説明にはなっていない。

どのように解決するのですか?

あなたの特定のケースでは、次のように使用することができます。 bash コマンドを使うことができます ( bash はmacOSのデフォルトのシェルです)。

for f in *.png; do echo mv "$f" "${f/_*_/_}"; done

注意: もしファイル名が - で始まる可能性がある場合は -- をそれらの前に置く[1]。

mv -- "$f" "${f/_*_/_}"

注意 echo の前に mv に付加されます。実際のリネームを行うにはこれを削除してください。

コマンドラインから実行するか、スクリプトで使用することができます。

  • "${f/_*_/_}"bash パラメータ展開 : (最初の)部分文字列のマッチングパターン _*_ はリテラル _ に置き換えられ、名前から中間のトークンが効果的にカットされます。
  • 注意点として _*_ パターン (グロビングにも使われるワイルドカード表現)ではなく 正規表現 ではありません (パターンについて学ぶには man bash を検索し Pattern Matching ).

頻繁にファイルのバッチリネームをすることがある場合。 のような特別なツールのインストールを検討してください。 rename ユーティリティ . macOS では、一般的なパッケージマネージャを使用してインストールすることができます。 ホームブリュー を使ってインストールできます。

brew install rename

上のコマンドと同等のものを rename :

rename -n -e 's/_.*_/_/'  *.png

再度、このコマンドはドライランを実行します。 -n を削除して、実際のリネームを実行してください。

  • と同様に bash の解決策になります。 s/.../.../ はテキスト置換を行いますが bash - とは異なり 正規表現 が使用されます。

[1] 特別引数の目的 -- の目的は、ほとんどのユーティリティでサポートされているように、後続の引数が、以下のように扱われるべきであることを示すことです。 オペランド (値)として扱われることを示すもので、たとえそれが のように オプション で始まるため - のように ジェイコブC のノートです。