ファイル名の部分文字列を交換するバッチファイル名変更スクリプト?

ファイル名の部分文字列を交換するバッチファイル名変更スクリプト?

次のような名前のファイルグループがありますタイトル_12月_word1_word2.pngディレクトリとスワップword1word2各ファイル内で反復処理したいと考えています。

つまり、button_december_state_pressed.png->からbutton_december_pressed_state.png

これを実現する方法について何か提案はありますか?

OS X 用のバッチ プログラムのほとんどは、単語を分割するための文字を指定できないため、この問題を解決する簡単なスクリプトで誰かが助けてくれることを期待しています。

答え1

bash では、次のように実行できます。

  for i in *; do echo $i | awk -F'[_.]' '{print $1"_"$2"_"$4"_"$3 }' ; done

このコマンドは、まず現在のディレクトリにあるすべてのファイルを検索し、それらの名前を入力します(確認せずにこれらのファイル名には 3 つのアンダースコアと . が含まれていることに注意してください) を awk に渡すと、希望する順序に並べ替えられます。

唯一の注意点は、-F'[_.]'オプションは-F' '異なるフィールド間の区切り文字を識別するために使用され、この最後のケースでは区切り文字はデフォルト値であるスペースになります。ただし、 オプションは-F'[_.]'、交換可能な要素の文字クラス (この場合はアンダースコアとドット) を定義し、区切り文字として自由に使用できます。

編集:

さて、実際に何も移動せずにこれが機能するので、ファイルの名前を変更する実際の操作を実装できます。

  for i in *; do ni=$(echo $i | awk -F'[_.]' '{print $1"_"$2"_"$4"_"$3"."$5 }') && mv "$i" "$ni" ; done

答え2

Zshとzmv

zsh(OS Xにデフォルトで付属)をお持ちの場合は、zmv:

% zsh
% autoload -U zmv
% zmv 'title_december_(*)_(*).png' 'title_december_$2_$1.png'

次のコマンドを実行します (zmv -n実際に名前を変更せずにドライ ランを実行するために使用します)。

mv -- title_december_word1_word2.png title_december_word2_word1.png

明らかに、最初の部分が画像ごとに異なる場合は、もう少し柔軟に対応できます。

% zmv '(*)_(*)_(*).png' '$1_$3_$2.png' 
mv -- foo_bar_word1_word2.png foo_bar_word2_word1.png
mv -- title_december_word1_word2.png title_december_word2_word1.png

これが機能するのは、一致が貪欲であるため、他の一致グループの前の最後のアンダースコアまですべてのアンダースコアが飲み込まれるためです。


Perlスタイルrename

OS Xではrename自家製:

$ rename -n 's/(.*)_(.*)_(.*).png/$1_$3_$2.png/' *
'foo_bar_word1_word2.png' would be renamed to 'foo_bar_word2_word1.png'
'title_december_word1_word2.png' would be renamed to 'title_december_word2_word1.png'

この-nオプションは、名前が変更された内容のみを印刷します。

関連情報