こんにちは。きんくまです。
ファイルがたくさんあって、ファイル名に文字列を追加したり、置換したくなるときがときどきあります。
例)
foo.txt -> foo_140320.txt
foo.txt -> abc_foo.txt
てな感じに日付をつけたり、接頭子をつけたりしたいです。
それをなんとか簡単にしたいなと思ってシェルスクリプト書いてみました。
ネットでいろいろと検索しつつ作りました。
※自己責任でお使いください。(ファイル名の置換なので大事なものはバックアップとっておくと良いと思います)
renamefiles >> ファイルをダウンロード
スクリプトの中身です。
#!/bin/sh # Author: KinkumaDesign # http://www.kuma-de.com echo "¥n////////////////////////////¥n" echo " RENAME FILES SCRIPT" echo "¥n////////////////////////////¥n" echo "¥nselect mode¥n" echo "1: Add string BEFORE filename¥t(ex. foo.txt => bar_foo.txt )" echo "2: Add string AFTER filename ¥t(ex. foo.txt => foo_bar.txt )" echo "3: Replace filename ¥t(ex. foo.txt => bar.txt )¥n" read MODE if [ $MODE = "1" ] ; then echo "¥nmode 1: Add string BEFORE filename" echo "¥ninput argments¥n¥nfiles text¥nex) *.txt bar_¥n" read SELECTOR ADDEDTEXT for f in $SELECTOR; do NEWFN=`echo $f|sed -e "s/^/${ADDEDTEXT}/"`; echo "$f ¥t-> ${NEWFN}"; mv "$f" "${NEWFN}"; done echo "¥nrename completed!!¥n" elif [ $MODE = "2" ] ; then echo "¥nmode 2: Add string AFTER filename" echo "¥ninput argments¥n¥nfiles text¥nex) *.txt _bar¥n" read SELECTOR ADDEDTEXT for f in $SELECTOR; do NEWFN=`echo $f | sed -e "s/¥(¥.[^.]*$¥)/${ADDEDTEXT}¥1/"`; echo "$f ¥t-> ${NEWFN}" mv "$f" "${NEWFN}"; done echo "¥nrename completed!!¥n" elif [ $MODE = "3" ] ; then echo "mode 3: Replace filename" echo "¥ninput argments¥n¥nfiles find replace¥nex) *.txt foo bar¥n" read SELECTOR FINDTXT REPLACETXT for f in $SELECTOR; do NEWFN=`echo $f | sed -e "s/${FINDTXT}/${REPLACETXT}/g"`; echo "$f ¥t-> ${NEWFN}" mv "$f" "${NEWFN}"; done echo "¥nrename completed!!¥n" else echo "mode is not found. exit" exit 1 fi exit 0
使い方
まず実行権をつけます。
さきほどのファイルをどこかにおいて、cdでそのフォルダに移動したあと、
chmod a+x renamefiles
とやってから
./renamefiles
と打って何か表示されたら準備完了です。やめるときはControl + C で強制終了できます。
もし使っていて気に入ったら、/usr/local/bin というディレクトリにいれておけば、パスが通っているのでどこからでも使えるようになります。(その場合ははじめの./はいらないでコマンド名だけで大丈夫)
ただ、お試しの間は変更するファイルのある同じ階層のディレクトリに置いてあげてください。
モードを選ぶ
コマンドをうつとこのように表示されます。
% renamefiles //////////////////////////// RENAME FILES SCRIPT //////////////////////////// select mode 1: Add string BEFORE filename (ex. foo.txt => bar_foo.txt ) 2: Add string AFTER filename (ex. foo.txt => foo_bar.txt ) 3: Replace filename (ex. foo.txt => bar.txt )
モードは
1:
Add string BEFORE filename -> ファイル名の前に文字列追加
2:
Add string AFTER filename -> ファイル名と拡張子の間に文字列追加
3:
Replace filename -> ファイル名の置換
の3つとなります。
今回は1と押してエンターキーをおします。
1 mode 1: Add string BEFORE filename input argments files text ex) *.txt bar_
文字列変換の引数を入力
次に、ファイル名を変更したいファイルを指定して、何の文字列を追加したいかをスペースをはさんで入力します。
今回は拡張子(.txt)のファイルに日付を追加してみます。
*.txt 140320_
すると以下のように表示されて、ファイル名が変更されてプログラムの終了です。
*.txt 140320_ bar3.txt -> 140320_bar3.txt foo1.txt -> 140320_foo1.txt foo2.txt -> 140320_foo2.txt fuga2.txt -> 140320_fuga2.txt hoge1.txt -> 140320_hoge1.txt rename completed!!
モード2の「ファイル名の後ろに文字列追加」は同じやり方なので説明は省略します。
ファイル名置換
今度はモード3の文字列置換をやってみます。
% renamefiles //////////////////////////// RENAME FILES SCRIPT //////////////////////////// select mode 1: Add string BEFORE filename (ex. foo.txt => bar_foo.txt ) 2: Add string AFTER filename (ex. foo.txt => foo_bar.txt ) 3: Replace filename (ex. foo.txt => bar.txt ) 3 mode 3: Replace filename input argments files find replace ex) *.txt foo bar
今度は3つの引数をとります。ファイルの種類、検索文字列、置換文字列の順です。
ためしに、さきほど置換した日付の文字列を変更してみます。
*.txt 140320 mtFuji
140320 を mtFuji に置換します
*.txt 140320 mtFuji 140320_bar3.txt -> mtFuji_bar3.txt 140320_foo1.txt -> mtFuji_foo1.txt 140320_foo2.txt -> mtFuji_foo2.txt 140320_fuga2.txt -> mtFuji_fuga2.txt 140320_hoge1.txt -> mtFuji_hoge1.txt rename completed!!
という感じに置換ができました。やったー!
作った感想とか
対話型のスクリプト書いてみたかったのでやってみた。2ステップなので、最初からモードの引数つければ、対話式にしなくてもよいっていうのはミンナニナイショダヨ。
こういう小さなツールはすぐに結果がわかるので、作ってて楽しかったです。
また何か作りたいな。
■ 自作iPhoneアプリ 好評発売中!
・フォルメモ - シンプルなフォルダつきメモ帳
・ジッピー電卓 - 消費税や割引もサクサク計算!
■ LINEスタンプ作りました!
毎日使える。とぼけたウサギ