web-dev-qa-db-ja.com

Linuxでファイルの名前を一括変更

'rename'コマンドを使用して画像の名前を「something_full.jpg」から「something_500.jpg」に再帰的に変更するにはどうすればよいですか?

7
Ticksy

基本的に、そのためにrenameツールを使用できます。 DebianベースのLinuxディストリビューションを備えたPerlベースのバージョンで提供されるはずですが、ソースからも簡単に ダウンロード できます(明らかに、最初にchmod +xで実行可能にする必要があります) 。


次のコマンドは、現在のディレクトリ内のすべてのJPGファイルの_full部分を_500に置き換えます。

rename 's/_full/_500/' *.jpg

これを再帰的に行うには、現在のディレクトリから開始して、renamefindを使用します。

find . -type f -iname "*.jpg" -exec rename 's/_full/_500/' {} \;

注:実際に実行する前にコマンドをテストすることをお勧めします。これを行うには、-nオプションをrenameに追加します(たとえば、rename's//'文字列の間)。

6
slhck

zmv を調べてみてください。 zmvはzsh固有の機能であり、_autoload -U zmv_が_.zshrc_ファイルのどこかにある必要があります。

編集:例として、OPが提起したタスクは次のように解決できます

_noglob zmv '(*)_full.(*)' '$1_500.$2'
_

zshcontribのマニュアルページからの抜粋:

_zmv [ -finqQsvwW ] [ -C | -L | -M | -p program ] [ -o optstring ] srcpat dest_

パターンsrcpatに一致するファイルをdestで指定された形式の名前を持つ対応するファイルに移動します(通常、名前を変更します)。ここで、srcpatにはパターンを囲む括弧が含まれ、destでは$ 1、$ 2、...に置き換えられます。例えば、

zmv '(*).lis' '$1.txt'

_foo.lis_の名前を_foo.txt_に、_my.old.stuff.lis_の名前を_my.old.stuff.txt_に変更します。

パターンは常にEXTENDED_GLOBパターンとして扱われます。置換によって名前が変更されないファイルは、単に無視されます。エラー(置換によって文字列が空になり、2つの置換によって同じ結果が得られ、宛先が既存の通常のファイルであり、-fが指定されなかった)、関数全体が何もせずに中止されます。

EXTENDED_GLOBパターンは非常に強力です。 ここ は概念の良い入門書です。

1
mkaito