私のディスク上でビットごとに同一でファイル名が異なる重複ファイルを見つけることは可能ですか?
fdupes
はこれを行うことができます。 man fdupes
から:
指定されたパスで重複ファイルを検索します。このようなファイルは、ファイルサイズとMD5シグネチャを比較し、その後にバイトごとの比較を行うことで見つかります。
DebianまたはUbuntuでは、apt-get install fdupes
を使用してインストールできます。 Fedora/Red Hat/CentOSでは、yum install fdupes
を使用してインストールできます。 Arch Linuxではpacman -S fdupes
、Gentooではemerge fdupes
を使用できます。
ファイルシステムルートから降順でチェックを実行するには、かなりの時間とメモリが必要になる可能性があり、fdupes -r /
などを使用します。
コメントで尋ねられたように、次の操作を行うことで最大の重複を取得できます。
fdupes -r . | {
while IFS= read -r file; do
[[ $file ]] && du "$file"
done
} | sort -n
これは、ファイル名に改行が含まれていると壊れます。
別の良いツールは fslint
です:
fslintは、重複ファイルや問題のあるファイル名など、ファイルシステムに関するさまざまな問題を見つけるためのツールセットです。
GUIに加えて個々のコマンドラインツールが利用可能であり、それらにアクセスするには、標準インストールの/ usr/share/fslint/fslintディレクトリを$ PATHに変更または追加できます。そのディレクトリにあるこれらの各コマンドには、パラメータの詳細を示す--helpオプションがあります。
findup - find DUPlicate files
Debianベースのシステムでは、次のコマンドでインストールできます。
Sudo apt-get install fslint
サードパーティのツールをインストールしたくない、またはインストールできない場合は、手動で行うこともできます。このようなプログラムのほとんどは、 ファイルチェックサム を計算することで機能します。 md5sumが同じファイルには、ほぼ確実にまったく同じデータが含まれています。だから、あなたはこのようなことをすることができます:
find / -type f -exec md5sum {} \; > md5sums
awk '{print $1}' md5sums | sort | uniq -d > dupes
while read -r d; do echo "---"; grep -- "$d" md5sums | cut -d ' ' -f 2-; done < dupes
出力例(この例のファイル名は同じですが、異なる場合にも機能します):
$ while read -r d; do echo "---"; grep -- "$d" md5sums | cut -d ' ' -f 2-; done < dupes
---
/usr/src/linux-headers-3.2.0-3-common/include/linux/if_bonding.h
/usr/src/linux-headers-3.2.0-4-common/include/linux/if_bonding.h
---
/usr/src/linux-headers-3.2.0-3-common/include/linux/route.h
/usr/src/linux-headers-3.2.0-4-common/include/linux/route.h
---
/usr/src/linux-headers-3.2.0-3-common/include/drm/Kbuild
/usr/src/linux-headers-3.2.0-4-common/include/drm/Kbuild
---
これは、すでに述べた専用ツールよりもかなり遅くなりますが、機能します。
短い答え:はい。
より長いバージョン:ウィキペディアを見てください fdupesエントリー 、これは既製のソリューションの非常に素晴らしいリストです。もちろん、あなたはあなた自身のものを書くことができます、それはそれ難しいことではありません-diff
、sha*sum
、find
、sort
、およびuniq
が適切に機能します。あなたはそれを1行に置くことさえできます、そしてそれはまだ理解できるでしょう。
ハッシュ関数(ここではMD5)がドメインで衝突がないと確信している場合:
find $target -type f -exec md5sum '{}' + | sort | uniq --all-repeated --check-chars=32 \
| cut --characters=35-
同じファイル名をグループ化したいですか?簡単なスクリプトを書くnot_uniq.sh
出力をフォーマットするには:
#!/bin/bash
last_checksum=0
while read line; do
checksum=${line:0:32}
filename=${line:34}
if [ $checksum == $last_checksum ]; then
if [ ${last_filename:-0} != '0' ]; then
echo $last_filename
unset last_filename
fi
echo $filename
else
if [ ${last_filename:-0} == '0' ]; then
echo "======="
fi
last_filename=$filename
fi
last_checksum=$checksum
done
次に、find
コマンドを変更してスクリプトを使用します。
chmod +x not_uniq.sh
find $target -type f -exec md5sum '{}' + | sort | not_uniq.sh
これは基本的な考え方です。おそらく、ファイル名にいくつかの文字が含まれている場合は、find
を変更する必要があります。 (例:スペース)
私は最近拡張されたfdupeのフォーク、 jdupes を追加すると考えました。これはfasterであり、fdupesよりも機能が豊富であることを約束します(サイズフィルターなど):
jdupes . -rS -X size-:50m > myjdups.txt
これにより、現在のディレクトリで50MBを超える重複ファイルが再帰的に検索され、結果のリストがmyjdups.txtに出力されます。
出力はサイズでソートされていないことに注意してください。組み込みではないようなので、これを実現するために上記の@Chris_Down回答を採用しました。
jdupes -r . -X size-:50m | {
while IFS= read -r file; do
[[ $file ]] && du "$file"
done
} | sort -n > myjdups_sorted.txt
ウィキペディアには記事( http://en.wikipedia.org/wiki/List_of_duplicate_file_finders )があり、このタスクで使用できるオープンソースソフトウェアのリストが記載されていましたが、現在は削除されています。
FslintのGUIバージョンは非常に興味深いものであり、マスクを使用して削除するファイルを選択できます。複製された写真をきれいにするのに非常に便利です。
Linuxでは次を使用できます。
- FSLint: http://www.pixelbeat.org/fslint/
- FDupes: https://en.wikipedia.org/wiki/Fdupes
- DupeGuru: https://www.hardcoded.net/dupeguru/
多くのシステム(Windows、Mac、Linux)での最後の2つの作業は、FSLintをチェックしていません
これが私の見解です。
find -type f -size +3M -print0 | while IFS= read -r -d '' i; do
echo -n '.'
if grep -q "$i" md5-partial.txt; then echo -e "\n$i ---- Already counted, skipping."; continue; fi
MD5=`dd bs=1M count=1 if="$i" status=noxfer | md5sum`
MD5=`echo $MD5 | cut -d' ' -f1`
if grep "$MD5" md5-partial.txt; then echo "\n$i ---- Possible duplicate"; fi
echo $MD5 $i >> md5-partial.txt
done
ファイルの最初の1 MBまでしかハッシュしないという点が異なります。
これにはいくつかの問題/機能があります:
ビデオクリップの比較に使用するので、これで十分です。