ファイル名中の"てすと"を"テスト"に変換するシェルスクリプトを作った。
前提
ファイル数は500くらい
ファイル名にきっちりとした規則性はない
ファイルは同一フォルダー内に集められている
ファイル名中に"てすと"もしくは"テスト"を必ず含む
ファイル名中には半角スペースを含む場合がある
#!/bin/sh
ls|cat -n > list.txt
count=1
max=`wc -l list.txt | cut -d " " -f 1`
while test $count -lt `expr $max + 1`
do
echo "count=$count" #Debug0
if [ $count -lt 10 ]; then #1-9
file=`grep " $count" list.txt |cut -d " " -f 2 2>/dev/null`
echo "count is 1-9"
fi
if [ $count -gt 9 ] && [ $count -lt 100 ]; then #10-99
file=`grep " $count" list.txt |cut -d " " -f 2 2>/dev/null`
echo "count is 10-99"
fi
if [ $count -gt 99 ] && [ $count -lt 1000 ]; then #100-999
file=`grep " $count" list.txt |cut -d " " -f 2 2>/dev/null`
echo "count is 100-999"
fi
echo "file=$file" #Debug1
tmp=`echo $file |grep てすと 2>/dev/null`
echo "tmp=$tmp" #Debug2
if [ "$tmp" != "" ]; then
mfile=`echo $file | sed s/てすと/テスト/`
echo "mfile=$mfile"
mv "$file" "$mfile" 2>/dev/null
fi
count=`expr $count + 1`
done
大体のファイル数を知るためにlist.txtの行数を調べて$maxに代入する。
(返り値は例えば"506 list.txt"なのでcutで一行目だけを切り出す)
一番の難関は半角スペースを含むファイル名、
例えば"script 2004年05月12日 てすと12.mp3"は
for i in `ls`を通すと
"script"
"2004年05月12日"
"てすと12.mp3"
の3つに分断されて変数$iに代入されてしまうことだ。
スペースを含むファイル名をちゃんと変数に代入するために、
ファイル一覧を行番号を付けてlist.txtというファイル名で保存する。
この時list.txtは以下ようになっている。
1 list.txt
(略)
56 script 2004年05月12日 てすと12.mp3
(略)
262 script 2004年11月30日 てすと78.mp3
(略)
その特徴は
行番号は1桁のときは、行番号の前に5個のスペースがある
桁が上がって2桁の時には、行が番号の前に4個のスペースがある
3桁の時には、行番号の前に3個のスペースがある
行番号とファイル名はタブで区切られている
$count行を変数$fileに代入するためにgrepでlist.txtで切り出すのだが、
$countが1桁のときは行番号の前にスペースが5個あるので"_____$count"で切り出す。
同様に2桁のときはスペースが4個あるので"____$count"で切り出す。
さらに、ファイル名を表す文字列を取得するために2列目を取り出さなければならない。
cutのセパレーターがスペースだと、スペースを含む文字列は当然分割されてしまう。
そこで、タブをセパレーターとしてcutで2列目を切り出して、
スペースを含む文字列をまるまる変数に入れることが出来る。
awkを使えばもっと簡単に出来たかもしれない。
WindowsXP上のファイルでcygwinを利用して同じファイルを探すシェルスクリプトを作った。
第??回を探して同じのが合ったら出力することにした。
前提
ファイル数は500くらい
ファイル名中に第??回という文字列が含まれる
第??回の??は3桁の数字。
ファイル名にきっちりとした規則性はない
ファイルは同一フォルダー内に集められている
ファイルのリストをls > list.txtというファイルに書き出している