[Shell] bash: ファイル名を一括で変更する

Terminal.app上でシェルスクリプト。

[markdown]
## ファイル名の一部を一括変換する

こちらの下の方の回答。

> * [Macでファイル名の一部を一括変換する方法を教えてください。 例.. – 人力検索はてな](http://q.hatena.ne.jp/1307416641)

menu を globalnav に変更したい。

“`prettyprinted
% ls
menu-1-on.png menu-2.png menu-4-on.png menu-5.png menu-7-on.png
menu-1.png menu-3-on.png menu-4.png menu-6-on.png menu-7.png
menu-2-on.png menu-3.png menu-5-on.png menu-6.png menu-8.png
“`

こんな形式。
backtick で囲んで、ls コマンドの出力を利用しているところがかっこいい。

“`bash
% for f in `ls`; do mv $f ${f/menu/globalnav}; done
“`

結果はこんな感じ。

“`prettyprinted
% ls
globalnav-1-on.png globalnav-3-on.png globalnav-5-on.png globalnav-7-on.png
globalnav-1.png globalnav-3.png globalnav-5.png globalnav-7.png
globalnav-2-on.png globalnav-4-on.png globalnav-6-on.png globalnav-8.png
globalnav-2.png globalnav-4.png globalnav-6.png
“`

こんな書き方もある。
-on を _hover に変更する。

“`bash
% for file in *-on.png ; do mv “$file” “${file%-on.png}_hover.png” ; done
“`

> * [bash – Removing part of a filename with mv – Stack Overflow](http://stackoverflow.com/questions/8364721/removing-part-of-a-filename-with-mv)

上記は、一致するパターンを置換している。

> * [ShellScript – Shell Script での文字列操作 – Qiita](http://qiita.com/sotarok/items/9f2ccffc23bd36534e2e)

## ファイル名の一部を削除する

globalnav を削除したい。

“`bash
% for file in `ls` ; do mv “$file” “${file#globalnav-}” ; done
“`

結果。

“`prettyprinted
% ls
1.png 2_hover.png 4.png 5_hover.png 7.png
1_hover.png 3.png 4_hover.png 6.png 7_hover.png
2.png 3_hover.png 5.png 6_hover.png 8.png
“`
[/markdown]