[ターミナルTerminal] 複数ファイルのファイル名に文字列を追加したり、置換したりするシェルスクリプト作った

2014/03/20

こんにちは。きんくまです。

ファイルがたくさんあって、ファイル名に文字列を追加したり、置換したくなるときがときどきあります。

例)
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ステップなので、最初からモードの引数つければ、対話式にしなくてもよいっていうのはミンナニナイショダヨ。
こういう小さなツールはすぐに結果がわかるので、作ってて楽しかったです。
また何か作りたいな。

LINEで送る
Pocket

自作iPhoneアプリ 好評発売中!
フォルメモ - シンプルなフォルダつきメモ帳
ジッピー電卓 - 消費税や割引もサクサク計算!

ページトップへ戻る