質問: 重複ファイルを探す速度が速く、ファイルを開いてハッシュする必要はありません。 @taltmanは素晴らしいと速いスクリプトを書いた。ここ、MD5は、同じサイズのファイルが見つかった場合にのみ使用されます。このスクリプトはCentosでのみ実行されます。そして、最大のファイルの出力を提供しません。
状態:Cinnamon Mintで実行するスクリプトを移植しました。ファイル名のスペースも処理できます。それここ。次のように出力します。
MD5 30599d19eb93cfb45030a1b0270e698c:
./../abc.jpg
./../xyz.jpg
MD5 3d0bc4e9ec8c77f5a430d8455252ef58:
./../def.mp4
./../hij.mp4
レポートブロックにサイズ(下が最も大きい)でソートを追加してサイズを表示したいです。出力は私が好きなものと同じです。
## 4.53MB (MD5 30599d19eb93cfb45030a1b0270e698c):
./../abc.jpg
./../xyz.jpg
## 1.76GB (MD5 3d0bc4e9ec8c77f5a430d8455252ef58):
./../def.mp4
./../hij.mp4
助けを求める:AWKを本当に理解する人はいますか?助けたいですか?
ベストアンサー1
あなたの質問に対する答えではないかもしれませんが、実装するのは簡単です。私はそれをbashで書いたが、おそらくawkを扱うよりも簡単です。
#!/usr/bin/env bash
die()
{
echo >&2 "$@"
exit 1
}
usage()
{
echo >&2 "Usage: $0 path"
die
}
checkdupes() {
local path="$1"
declare -A flist
declare -a output_array
while read -r sum fname; do
if [[ ${flist[$sum]} ]]; then
fsize=$(stat --printf="%s" "$fname")
fsize_converted=$(convert_bytes "$fsize")
output_array+=("$fsize_converted $(md5sum "$fname") and ${flist[$sum]} are identical")
fi
flist[$sum]+="$fname"
done < <(find "$path" -type f -exec sha256sum {} +)
IFS=$'\n' sorted_array=($(sort -h <<<"${output_array[*]}"))
unset IFS
for ((i=${#sorted_array[@]}-1; i>=0; i--)); do
printf '%s\n' "${sorted_array[i]}"
done
}
convert_bytes() {
local bytes=$1
local unit=""
local value=""
if ((bytes < 1024)); then
unit="B"
value=$bytes
elif ((bytes < 1048576)); then
unit="KB"
value=$((bytes / 1024))
elif ((bytes < 1073741824)); then
unit="MB"
value=$((bytes / 1048576))
else
unit="GB"
value=$((bytes / 1073741824))
fi
printf '%d%s' "${value}" "${unit}"
}
if (($# < 1)); then
usage
else
checkdupes "$1"
fi
私のSEスクリプトでこの部分を見ることができます。
die()
{
echo >&2 "$@"
exit 1
}
usage()
{
echo >&2 "Usage: $0 path"
die
}
これは実際にエラー処理の一部です。というファイルを生成してerrorhandling
スクリプトからインポートできます。
使用法:
./check_dupes [path]
役に立ったことを願っています!