最近、更新がご無沙汰だったので自分用にちょっと書いたシェルスクリプトを掲載します。
Windowsのブラウザで同名ファイルをダウンロードすると、IEやchromeだと”ファイル名 (1)”みたいなファイル名で保存されるのですが、最近間違えて2回DLリンクをクリックしたり、DLしたのが最新版だったか忘れたために再度DLしたりと何かと同じ名前のファイルが溜まってきました。
単純に同じファイルだけなら、([1-9])と入っているファイルを削除すればいいだけなのですが、同名ファイルだが中身は違うファイル等も幾つか入っているため、そういったものを判別して削除するためのシェルスクリプトを書きました。
なぜ、Windowsなのにシェルスクリプトなのかというと、多分重複ファイルを削除するツールはあるのでしょうが、今の状況にマッチするツールを探すのが面倒だったのと、私の環境ではDLディレクトリをVWのLinux上にマウントしていたので、単純にDiffで比較すれば済む話だと思い、それをするシェルスクリプトを書こうと思ったため、シェルスクリプトで書いてしまいました。
実際には、ちょっと手間取る部分もあったのですが、最終的に以下のようなシェルスクリプトを書きました。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
trap 'rm -f "$TMPFILE"' EXIT | |
TARGETDIR="/home/USER/Downloads/" | |
TMPFILE=$(mktemp 2>/dev/null||mktemp -t tmp) | |
cd ${TARGETDIR} | |
ls . | grep -e "([1-9])" > ${TMPFILE} | |
while read difffile | |
do | |
echo "diff file : " ${difffile} | |
origifile=`echo ${difffile} | sed -e "s/ ([1-9])//"` | |
echo "origi file : " ${origifile} | |
diff -qsr "${origifile}" "${difffile}" | |
if [ $? -eq 0 ]; then | |
echo "${origifile} == ${difffile}" | |
echo "rm -r \"${difffile}\"" | |
rm -r "${difffile}" | |
fi | |
done <${TMPFILE} | |
cd – |
やっている事自体は単純で、対象のディレクトリに移動後、lsでファイル一覧を取得し、重複ファイルに含まれる文字列を含むファイルのみをgrepで抽出、その後そのファイルとそのファイルから([1-9])を省いたファイルを比較して一致していれば、そのファイルを削除しています。
自分用に書いているので、検証を面倒がって遠回しな処理等もありますが(ディレクトリを移動して処理等)、一応、処理自体は単純なので、sambaマウント等でも動くと思います。(未検証)
一度対象ファイルをTEMPファイルに書き出しているのは、単純に実行結果をシェル変数に入れるとファイル名内の空白でファイル名が区切られてしまう(Windowsの重複ファイルが対象のため、空白がほぼ入っている)ため、一度ファイルに1ファイル1行で書きだした上で、1行づつ読み込んで処理しています。
処理を面倒がって省略できるところを無駄に書いている部分もあるので、気が向いたらそこは修正します。