次のような名前のファイルグループがありますタイトル_12月_word1_word2.pngディレクトリとスワップword1
をword2
各ファイル内で反復処理したいと考えています。
つまり、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
$ 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
オプションは、名前が変更された内容のみを印刷します。