ターミナルでのパターンベースのバッチファイルの名前変更


48

次の名前を変更する必要があります。

file_001_loremipsum.png
file_002_dolor.png
file_003_sit.png
file_004_amet.png
file_105_randomness.png

upl_loremipsum.png
upl_dolor.png
upl_sit.png
upl_amet.png
upl_randomness.png

ターミナルコマンドを1行だけ使用して、どうすればそれを実現できますか?


1
すべてのサブフォルダに再帰的に動作しますフェイルセーフ正規表現ベースのPythonのバージョン:stackoverflow.com/a/39698169/191246
ccpizza

回答:


79

renameを使用した上記の例の解決策:

rename -v -n 's/file_\d{1,3}/upl/' file_*.png

使用法:

rename [options] [Perl regex search/replace expression] [files]

からman rename

   -v, --verbose
           Verbose: print names of files successfully renamed.
   -n, --no-act
           No Action: show what files would have been renamed.

renameは、引数として正規表現を取ることができます。

私たちが見ているのは、単一引用符の間の内容'です。で区切って正規表現を配置でき/ます。

式:s/(1)/(2)/ここで、(1)=検索パターン、および(2)=置換パターン。

したがって、正規表現慣れて、パターンベースのバッチファイルの名前変更をお楽しみください!


14
これがUbuntuであることは知っていますが、OS Xソリューションを探していたとしてもここにたどり着いた場合(私はそうしました)、renameで簡単にインストールできbrew install renameます。
サンドストローム

Ubuntu 18.10では、代わりに--no-actフラグが--nono使用されます。この答えは、もう少し明確にすることもでき[files]ます。名前を変更する可能性のある現在のディレクトリ内のファイルに一致する初期パターンを参照します(たとえば、*現在のディレクトリ内のすべてに一致します)。
パトリックダーク

あなたのリンクは別のを指しrenameます。これはフォーマットがrename from to fileあり、正規表現をサポートしていません。実際、私のLinuxディストリビューション(Cent OS 7)にはまさにそのバージョンがあります。
アレックスチェ

6

ファイルが複数のディレクトリにある場合、次のような検索の後に名前変更を使用します。

find -iname file_*.png -type f -exec rename -n 's/file_[0-9]{3}(.*\.png)/upl$1/' {} \;

名前を変更した後の-nはテストのため、削除するには続行します!-)

このように、パワーを検索して名前を変更します。

個人的には、ソースヘッダーの名前を.hから.hppに変更しました

find -iname *.h -type f -exec rename 's/(.*\.)h/$1hpp/' {} \;

ドキュメントあります-iname-type-execのフラグがでmanpages.ubuntu.com/manpages/bionic/man1/find.1.html#expression。(find --helpこのコマンドには特に役立ちません。)TL; DR:-inameパターンを大文字と小文字を区別せずに一致させます。-type f「通常のファイル」に一致します。(セミコロン)文字に-exec遭遇するまで式を実行します;
パトリックダーク

5

これは、bashパラメーター展開の小さな魔法で行うことができます!

for f in file_[0-9]*_*; do mv $f upl_${f#file_[0-9]*_}; done

file_[0-9]*_*;-最初のパターンは、「file_anynumber_」で始まるすべてのファイルを処理するために使用されます-2
${f#file_[0-9]*_}番目のパターンfile_[0-9]*_は、bashに文字列の先頭から「file_anynumber_」を削除するよう指示するパラメーター拡張で使用されます。

詳細についてはParameter expansion

man bash

これは正規表現ではなくグロブを使用するため[0-9]*、任意の文字列が続く1桁に一致することに注意してください。数字だけを一致させるより良い方法はおそらくありますが、簡潔なことは考えられません。
-wjandrea

また、このコマンドをすべてのサブディレクトリで再帰的に機能させる方法を提案できますか?
フランチェスコDM
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.