スポンサーリンク

同じファイルを探すシェルスクリプト


[Linux]ファイル名を直すシェルスクリプト

ファイル名を直すシェルスクリプト


ファイル名中の"てすと"を"テスト"に変換するシェルスクリプトを作った。



前提
ファイル数は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を使えばもっと簡単に出来たかもしれない。


[Linux]同じファイルを探すシェルスクリプト

同じファイルを探すシェルスクリプト


WindowsXP上のファイルでcygwinを利用して同じファイルを探すシェルスクリプトを作った。


前提
ファイル数は500くらい
ファイル名中に第??回という文字列が含まれる
第??回の??は3桁の数字。
ファイル名にきっちりとした規則性はない
ファイルは同一フォルダー内に集められている
ファイルのリストをls > list.txtというファイルに書き出している
第??回を探して同じのが合ったら出力することにした。



#!/bin/sh
count=0
file="list.txt" #ls >list.txt
while [ $count -lt 510 ];
do
count=`expr $count + 1`
count=`echo $count | awk.exe '{printf("%03d",$1)}'`
fold=`grep.exe 第$count回 $file |wc.exe -l`
if [ $fold -eq 2 ]; then
echo "$count"
fi
done


$countが510未満の間、countをawkを利用して3桁に桁そろえしてインクリメント。

第$count回をキーワードにして$fileをgrepして、

キーワードが存在する行を切り出す。

その行数をwcでカウントして$foldにいれる。

この$foldが2ならば、同じファイルが存在することになる。

2ならば$countを出力する。