macOSターミナルでファイルの名前を一括変更する方法


123

次の名前の一連のファイルを含むフォルダがあります。

prefix_1234_567.png
prefix_abcd_efg.png

出力が次のようになるように、1つのアンダースコアと中間のコンテンツを一括削除したいと思います。

prefix_567.png
prefix_efg.png

関連するが完全に説明的ではない:


NSStringとNSMutableStringのrangeメソッドとsubstringメソッドを見てください
Grady Player

1
これに対する非ターミナルソリューションを検討しましたか?Automatorワークフローは、これらのタイプの操作を簡単に実行できます。すべてのファイルの名前を変更し、テキストを_*_空白で置き換えるオートマトンワークフローを作成できます。
暗号化2014年

オートマトンはワイルドカードを実行できないと思いました
誘拐犯

回答:


234

特定のケースでは、次のbashコマンドを使用できます(bashmacOSのデフォルトのシェルです)。

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

注:ファイル名がで始まる可能性がある場合は--- その前に配置してください[1]:
mv -- "$f" "${f/_*_/_}"

注:echomv、予行演習を実行するためにに付加されています。削除して実際の名前変更を実行します。

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

  • "${f/_*_/_}"bash パラメータ展開のアプリケーションです。(最初の)部分文字列の一致パターン_*_がliteral _に置き換えられ、名前から中央のトークンが効果的に削除されます。
  • 正規表現ではなく_*_パターン(グロビングにも使用されるワイルドカード表現)であることに注意してください(パターンについて学習し、を実行して検索します)。man bashPattern Matching

ファイルの名前の一括変更を頻繁に行う場合は、Perlベースのrenameユーティリティなどの専用ツールのインストールを検討してください。macOSでは、一般的なパッケージマネージャーのHomebrewを使用して次のようにインストールできます。

brew install rename

以下は、先頭にあるコマンドと同等のものですrename

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

繰り返しますが、このコマンドは予行演習を実行します。削除-nして実際の名前変更を実行します。

  • bashソリューションと同様に、s/.../.../テキスト置換を実行しますが、-とは異なりbash-真の正規表現が使用されます。

[1] --ほとんどのユーティリティでサポートされている特別な引数の目的は、Jacob C.が指摘しているように、後続の引数がで始まるためにオプションのように見える場合でも、後続の引数をオペランド(値)として扱う必要があることを通知することです。-


3
素晴らしい答え、完璧に働きました。私はまた、あなたが戻ってそれを編集してより説明し、これを繰り返すとよりエレガントな解決策を提供することを感謝しています。繰り返しますが、とても感謝しています。とても親切です
誘拐事件

4
一致する置換(.*-> $1)を使用した例。例:Rename Foo bar S01E01 biz baz.extto S01E01.extrename -n -e 's/.*(S[0-9]{2}E[0-9]{2}).*(\.[a-z]{2,4})/$1$2/' *
Steve Robbins

2
echo予行演習に使用するアイデアが大好きです。先端をありがとう!
James Wright

だけを強くお勧めしますbrew install rename
クリスレッドフォード

98

ファイルの名前を変更するには、renameユーティリティを使用できます。

brew install rename

たとえば、現在のディレクトリにあるすべてのファイル名の検索文字列を変更するには:

rename -nvs searchword replaceword *

「n」パラメーターを削除して、変更を適用します。

より詳しい情報: man rename


1
OS XGNU bashx86_64-apple-darwin)のバージョンには、名前変更ユーティリティは含まれていません。
l'L'l

4
おかげで、はい、それを介してインストールする必要がありますbrew install rename
デビッドトーマス

2
このヒントは素晴らしいです!入力するrename -vs GLYCOPHORIN GLYCC *と、450以上のファイルの名前が自動的に変更されます。そして、超高速。
Sander W. van der Laan

3
優れた!それが実際に物事の名前を変更する前に、「何が変更されるかを示す」部分が大好きです!
Ben Duffin

3
正規表現も使用できます。's / 123 / onetwothree / g'の名前を変更*
Bryan

12

あなたはsedを使うことができます:

ls * | sed -e 'p;s@_.*_@_@g' | xargs -n2 mv

結果:

prefix_567.png prefix_efg.png

*最初に予行演習を行うにはmv、最後にecho

説明:

  • e:1つのsedコマンドのみのオプション。
  • p:sedへの入力を出力します。この場合、名前を変更する前の元のファイル名になります。
  • @:は、sedを読みやすくするための/文字の置き換えです。つまり、sed s / search / replace / gを使用する代わりに、s @ search @ replace @ gを使用します。
  • _。*:下線は、実際の「。」を参照するエスケープ文字です。ゼロ回以上の文字(正規表現のすべての文字とは対照的)
  • -n2:パラメーターとしてmvに渡す必要がある2つの出力があることを示します。lsからの各入力に対して、このsedコマンドは2つの出力を生成し、それをmvに提供します。

1
巧妙ですが、やや難解です。スペースが埋め込まれたファイル名もサポートするために、これをより一般的にすると、さらに不可解になりますls * | xargs -I % bash -c 'echo mv "%" "$(sed 's@_.*_@_@' <<<"%")"'echo実際の名前変更は削除してください)。
mklement0 2014年

2
アーケイン?これ大好き!
ビラルアキル

7

次のようなファイルのバッチがありました:be90-01.pngダッシュをアンダースコアに変更する必要があります。私はこれを使用しましたが、うまくいきました:

for f in *; do mv "$f" "`echo $f | tr '-' '_'`"; done



1

これを試して

for i in *.png ; do mv "$i" "${i/remove_me*.png/.png}" ; done

ここに別の方法があります:

for file in Name*.png; do mv "$file" "01_$file"; done
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.