Saya memiliki folder dengan duplikat (oleh md5sum
( md5
pada Mac)) file, dan saya ingin memilikicron pekerjaan dijadwalkan untuk menghapus yang ditemukan.
Namun, saya terjebak pada bagaimana melakukan ini. Apa yang saya miliki sejauh ini:
md5 -r * | sort
Yang menghasilkan sesuatu seperti ini:
04c5d52b7acdfbecd5f3bdd8a39bf8fb gordondam_en-au11915031300_1366x768.jpg
1e88c6899920d2c192897c886e764fc2 fortbourtange_zh-cn9788197909_1366x768.jpg
266ea304b15bf4a5650f95cf385b16de nebraskasupercell_fr-fr11286079811_1366x768.jpg
324735b755c40d332213899fa545c463 grossescheidegg_en-us10868142387_1366x768.jpg
3993028fcea692328e097de50b26f540 Soyuz Spacecraft Rolled Out For Launch of One Year Crew.png
677bcd6006a305f4601bfb27699403b0 lechaustria_zh-cn7190263094_1366x768.jpg
80d03451b88ec29bff7d48f292a25ce6 ontariosunrise_en-ca10284703762_1366x768.jpg
b6d9d24531bc62d2a26244d24624c4b1 manateeday_row10617199289_1366x768.jpg
ca1486dbdb31ef6af83e5a40809ec561 Grueling Coursework.jpg
cdf26393577ac2a61b6ce85d22daed24 Star trails over Mauna Kea.jpg
dc3ad6658d8f8155c74054991910f39c smoocave_en-au10358472670_1366x768.jpg
dc3ad6658d8f8155c74054991910f39c smoocave_en-au10358472670_1366x7682.jpg
Bagaimana saya bisa memproses berdasarkan MD5 file untuk menghapus duplikat? Saya tidak benar-benar peduli yang "asli" Saya terus - tapi aku hanya ingin menyimpan satu.
Haruskah saya mendekati ini dengan cara yang berbeda?
bash
shell-script
hashsum
duplicate
warren
sumber
sumber
fdupes
perintah yang akan melakukan ini ... Tidak yakin distro mana yang Anda gunakan, tetapi itu dalam paket Debian dengan nama yang sama. Juga, MD5 adalah hash yang cukup lemah saat ini; Anda mungkin ingin menggunakansha256sum
atau lebih baiksha512sum
(yang sebenarnya harus lebih cepat pada perangkat keras PC normal)Jawaban:
Saya bekerja di Linux, yang artinya adalah perintah
md5sum
yang menghasilkan:Sekarang menggunakan
awk
danxargs
perintahnya adalah:Bagian
awk
diinisialisasilasthash
dengan string kosong, yang tidak akan cocok dengan hash apa pun, dan kemudian memeriksa untuk setiap baris jika hash dilasthash
sama dengan hash (kolom pertama) dari file saat ini (kolom kedua). Jika ya, itu akan mencetaknya. Pada akhir setiap langkah itu akan diaturlasthash
ke hash dari file saat ini (Anda dapat membatasi ini hanya diatur jika hash berbeda, tetapi itu harus menjadi hal kecil terutama jika Anda tidak memiliki banyak file yang cocok). Nama file awk meludah keluar dimasukkan kerm
denganxargs
, yang pada dasarnya panggilanrm
dengan apa yangawk
bagian memberi kita.Anda mungkin perlu memfilter direktori sebelumnya
md5sum *
.Edit:
Menggunakan metode Marcins Anda juga bisa menggunakan yang ini:
Subtract ini dari daftar file yang dipilih oleh
ls
nama file pertama dari setiap hash unik yang dipilih olehmd5sum * | sort -k1 | uniq -w 32 | awk '{print $2}'
.sumber
md5 -r * | sort -t ' ' -k 4 -r | awk 'BEGIN{lasthash = ""} $1 == lasthash {print $2} {lasthash = $1}' | xargs rm
adalah panggilan di OS X (sesuai saran Stephen Kitt , saya letakkanecho 'will remove '
di bagian akhir sebelum mencobanyarm
)sort -t ' ' -k 4 -r
menjadisort
.Anda dapat mengidentifikasi file duplikat menggunakan perintah berikut:
sumber
Saya menemukan fdupes sebagai jawaban untuk pertanyaan serupa ini: /superuser/386199/how-to-remove-duplicated-files-in-a-directory
Saya bisa
apt-get install fdupes
di Ubuntu. Anda pasti ingin membaca halaman manual. Dalam kasus saya, saya bisa mendapatkan hasil yang diinginkan seperti:fdupes -qdN -r /ops/backup/
Yang mengatakan "lihat secara rekursif melalui / ops / backup dan temukan semua file duplikat: simpan salinan pertama dari file yang diberikan, dan diam-diam hapus sisanya." Ini membuatnya sangat mudah untuk menyimpan beberapa dump dari database yang jarang-menulis.
sumber
Jika Anda sedang terburu-buru (atau Anda memiliki banyak file) dan ingin menghindari overhead semacam (itu membutuhkan waktu) tetapi tidak keberatan memori overhead tabel hash (atau Anda memiliki banyak ram dengan banyak Anda file),
find . -type f -print0
: Temukan semua file dan hasilkan dengan nama yang diakhiri nullxargs -0 md5sum
: menghitung hash secara paralel (sesuaikan-n
max-args dan-P
max-procs seperti yang diinginkan, lihatman xargs
)awk 'h[$1]{ printf "%s\0", $2; next }{ h[$1] = $2 }'
: jika ada entri di hask awk yang berisi md5sum yang sedang kita lihat, kemudian cetak nama file yang sedang kita lihat, null-terminated. Jika tidak, tambahkan nama file ke tabel hash.xargs -0 rm
: ambil string yang diakhiri dengan piped-in null dan kirimkan ke rm.Ini jauh lebih cepat daripada fdupes.
Jika Anda memiliki nama file yang berisi baris baru, awk mungkin akan memotongnya di baris baru karena md5sum memisahkan catatan dengan baris baru juga.
Ini didasarkan pada /programming/11532157/remove-duplicate-lines-without-sorting dan /programming/9133315/how-can-i-output-null-terminated- string-in-awk
sumber
sumber
Fitur:
ls
atau sejenisnya--color=always
sumber