Apakah mungkin untuk menemukan file duplikat di disk saya yang sedikit identik tetapi memiliki nama file yang berbeda?
st_size
s, menghilangkan mereka dengan hanya satu yang sama, dan kemudian hanya menghitung md5sums untuk pencocokan st_size
s.
Apakah mungkin untuk menemukan file duplikat di disk saya yang sedikit identik tetapi memiliki nama file yang berbeda?
st_size
s, menghilangkan mereka dengan hanya satu yang sama, dan kemudian hanya menghitung md5sums untuk pencocokan st_size
s.
Jawaban:
fdupes
dapat melakukan ini. Dari man fdupes
:
Mencari jalur yang diberikan untuk file duplikat. File tersebut ditemukan dengan membandingkan ukuran file dan tanda tangan MD5, diikuti oleh perbandingan byte-by-byte.
Di Debian atau Ubuntu, Anda dapat menginstalnya dengan apt-get install fdupes
. Di Fedora / Red Hat / CentOS, Anda dapat menginstalnya dengan yum install fdupes
. Di Arch Linux, Anda dapat menggunakan pacman -S fdupes
, dan di Gentoo emerge fdupes
,.
Untuk menjalankan pemeriksaan menurun dari root sistem file Anda, yang kemungkinan akan memakan banyak waktu dan memori, gunakan sesuatu seperti fdupes -r /
.
Seperti yang ditanyakan dalam komentar, Anda bisa mendapatkan duplikat terbesar dengan melakukan hal berikut:
fdupes -r . | {
while IFS= read -r file; do
[[ $file ]] && du "$file"
done
} | sort -n
Ini akan rusak jika nama file Anda mengandung baris baru.
fdupes ....... | xargs ls -alhd | egrep 'M |G '
untuk menyimpan file dalam format yang dapat dibaca Manusia dan hanya file dengan ukuran dalam Megabita atau Gigabita. Ubah perintah agar sesuai dengan hasil nyata.
du
piped untuk sort
memberi tahu Anda.
Alat bagus lainnya adalah fslint
:
fslint adalah toolset untuk menemukan berbagai masalah dengan sistem file, termasuk file duplikat dan nama file yang bermasalah, dll.
Alat baris perintah terpisah tersedia sebagai tambahan untuk GUI dan untuk mengaksesnya, seseorang dapat mengubah, atau menambah $ PATH direktori / usr / share / fslint / fslint pada instalasi standar. Masing-masing perintah dalam direktori tersebut memiliki opsi --help yang selanjutnya merinci parameternya.
findup - find DUPlicate files
Pada sistem berbasis debian, Anda dapat menginstalnya dengan:
sudo apt-get install fslint
Anda juga dapat melakukan ini secara manual jika Anda tidak ingin atau tidak dapat menginstal alat pihak ketiga. Cara sebagian besar program tersebut bekerja adalah dengan menghitung checksum file . File dengan md5sum yang sama hampir pasti berisi data yang persis sama. Jadi, Anda bisa melakukan sesuatu seperti ini:
find / -type f -exec md5sum {} \; > md5sums
gawk '{print $1}' md5sums | sort | uniq -d > dupes
while read d; do echo "---"; grep $d md5sums | cut -d ' ' -f 2-; done < dupes
Output sampel (nama file dalam contoh ini sama, tetapi juga akan berfungsi ketika mereka berbeda):
$ while read 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
---
Ini akan jauh lebih lambat daripada alat khusus yang telah disebutkan, tetapi itu akan berhasil.
st_size
, menghilangkan file yang hanya memiliki satu file dengan ukuran ini, dan kemudian menghitung md5sums hanya antara file dengan yang sama st_size
.
md5sum {}
dengan md5 -q {}
dan gawk '{print $1}'
dengancat
Jawaban singkat: ya.
Versi yang lebih panjang: lihat entri wikipedia fdupes , ini daftar yang cukup bagus dari solusi yang sudah jadi. Tentu saja Anda dapat menulis sendiri, itu tidak bahwa sulit - program hashing seperti diff
, sha*sum
, find
, sort
dan uniq
harus melakukan pekerjaan. Anda bahkan dapat meletakkannya di satu baris, dan itu masih bisa dimengerti.
Jika Anda yakin fungsi hash (di sini MD5) bebas tabrakan di domain Anda:
find $target -type f -exec md5sum '{}' + | sort | uniq --all-repeated --check-chars=32 \
| cut --characters=35-
Ingin nama file yang identik dikelompokkan? Tulis skrip sederhana not_uniq.sh
untuk memformat output:
#!/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
Kemudian ubah find
perintah untuk menggunakan skrip Anda:
chmod +x not_uniq.sh
find $target -type f -exec md5sum '{}' + | sort | not_uniq.sh
Ini ide dasar. Mungkin Anda harus berubah find
jika nama file Anda mengandung beberapa karakter. (mis. ruang)
Saya berpikir untuk menambahkan garpu fdupes yang disempurnakan, jdupes , yang menjanjikan lebih cepat dan lebih kaya fitur daripada fdupes (mis. Filter ukuran):
jdupes . -rS -X size-:50m > myjdups.txt
Ini akan secara rekursif menemukan file duplikat lebih besar dari 50MB di direktori saat ini dan menampilkan daftar yang dihasilkan di myjdups.txt.
Catatan, output tidak diurutkan berdasarkan ukuran dan karena tampaknya tidak dibangun, saya telah mengadaptasi jawaban @Chris_Down di atas untuk mencapai ini:
jdupes -r . -X size-:50m | {
while IFS= read -r file; do
[[ $file ]] && du "$file"
done
} | sort -n > myjdups_sorted.txt
Wikipedia memiliki artikel ( http://en.wikipedia.org/wiki/List_of_duplicate_file_finders ), dengan daftar perangkat lunak sumber terbuka yang tersedia untuk tugas ini, tetapi sekarang telah dihapus .
Saya akan menambahkan bahwa versi GUI dari fslint sangat menarik, memungkinkan untuk menggunakan mask untuk memilih file mana yang akan dihapus. Sangat berguna untuk membersihkan foto yang digandakan.
Di Linux Anda dapat menggunakan:
- FSLint: http://www.pixelbeat.org/fslint/
- FDupes: https://en.wikipedia.org/wiki/Fdupes
- DupeGuru: https://www.hardcoded.net/dupeguru/
2 pekerjaan terakhir pada banyak sistem (windows, mac dan linux) Saya belum memeriksa FSLint
Inilah pendapat saya:
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
Ini berbeda karena hanya memiliki hash hingga 1 MB file.
Ini memiliki beberapa masalah / fitur:
Saya menggunakannya untuk membandingkan klip video jadi ini sudah cukup bagi saya.