それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

ファイルサーバーを整理するために重複ファイルを探す

ファイルサーバーを適当に使ってたので、同じファイルが大量にある。

本当はbtfs を使えばいいんだろうけど、ext4 を使っているので重複ファイルの排除が手間です。

とりあえず、サクッと重複ファイルを探す

md5sum で重要するハッシュ値を探す。

サクッとカレントディレクトリ以下の重複ファイルを検出する。

md5-gen-list.sh

#!/usr/bin/env bash


IFS=$'\n'

FILE=filenames.txt
MD5LIST=md5-list.txt


truncate -s 0  ${MD5LIST}
truncate -s 0  ${FILE}

/usr/bin/find .  -type f > $FILE

size=$( cat ${FILE} | wc -l  )


echo $size

cat ${FILE} | while read i
do
  (( cnt++ ))
  percent=$( echo  "scale=3;${cnt}/${size}" | bc  )
  percent=$( echo  "scale=2;${percent} * 100 " | bc  )
  echo "$cnt/$size ( $percent )"
  echo md5sum ${i@Q}
  ## 全部読み込むと非効率なので、先頭10MBで十分とする
  #md5sum ${i} >> ${MD5LIST}
  echo $(dd if="$i" bs=1M count=10 2> /dev/null | md5sum -b | sed -e "s/\*-//" ) $i >> ${MD5LIST}
done


cat $MD5LIST  | sort | uniq -w32 -dD

md5sum / sha256sum などは全部のファイルを読み込む

全部のファイルを読み込んで指紋(ハッシュ)を計算する。ちょっとファイルの重複を手作業で調べるときにはとても不便である。

大量のファイルを「すべて読み込む」必要があるのが、ShaSUMであり、md5sum である

先頭1MB程度を読み込めば十分な気がする。念のため10MB を読み込めばいいのだろう。厳密に比較すると絶対に使えないが、どうせ似ているファイルを手作業で仕分けるのだから先頭を見れば十分な気がする。UbuntuのISOファイルとかその辺に散らばってるし。ファイル名を見れば整理できるけど、ファイル名を見るのすら面倒なので。

とりあえず、先頭数MBを読み込んで重複を検出しファイルを絞り込むことで時短を狙う。

バイナリを読み込む

シェルスクリプトは文字列を前提としている、などと言われるがバイナリを扱うことも置い

2MB を読み込む例

dd if=filename bs=1M count=2

dd は使いやすいバイナリ読み込みコマンドである。もし2MB未満なら、ファイル全体を読み込んでコマンド終了である。パディング処理はされない。

重複の検出

md5sum であれば次のように

cat md5-list.txt  | sort | uniq -w32 -dD

こえは、md5sum の結果が32文字になることを利用している。

重複ファイルを調べて削除

重複ファイルを、目で見て確認して同じファイルなら削除する。

npm やwordpress のファイルが大量に出てくるんですよね。やっぱりBtrfsなどを使って自動的に処理したほうが良さそうな気がする。