Baru-baru ini saya perlu menghapus banyak duplikat. Saya menggabungkan tiga atau empat sistem file, dan saya ingin ruang tersebut digunakan secara ekonomis. Pada awalnya, fdupes
sepertinya itu adalah alat terbaik untuk pekerjaan itu, tetapi saya semakin mengalami keterbatasan.
Pertimbangkan perintahnya fdupes -rdN somedirectory/
. Ini membuat hash dari semua file di subdirektori dari suatu direktori.
Dan ketika menemukan duplikat, itu menghapus mereka, sehingga hanya ada satu salinan dari segalanya.
Tetapi bagaimana jika saya ingin menyimpan somedirectory/subdirectory1/somefile
dan ternyata ada empat duplikat, dan program pertama kali bertemu dengan salah satu duplikat? Kemudian menghapus somedirectory/subdirectory1/somefile
, yang saya tidak inginkan.
Saya ingin dapat menentukan, entah bagaimana, duplikat mana yang harus disimpan. Dan sejauh ini, tidak ada program standar untuk menangani duplikat (duff, FSLint) tampaknya memungkinkan otomatisasi perilaku semacam itu. Saya lebih suka tidak menggulung sendiri, jadi itu sebabnya saya menanyakan pertanyaan ini.
Saya ingin dapat menulis sesuatu seperti
killdupes -rdN --keep=filesin,somedirectories,separated,by,commas somedirectory/
sumber
Jawaban:
Meskipun fungsi yang Anda cari tidak tersedia dalam stok
fdupes
, saya bercabangfdupes
(garpu saya dipanggiljdupes
) dan menambahkan beberapa fitur yang dapat menyelesaikan masalah ini dalam keadaan tertentu. Misalnya, dalam kasus yang dinyatakan di mana Anda ingin menyimpansomedirectory/subdirectory1/somefile
ketika menghapus duplikat otomatis (d
danN
beralih bersama) dan tidak ada file terpisah segera di bawahnyasomedirectory
,jdupes
dapat dimasukkan setiap jalur subdirektori langsung dengansubdirectory1
pertama dan-O
switch (yang mengurutkan file dengan perintah -pesanan parameter baris pertama):jdupes -nrdNO somedirectory/subdirectory1 somedirectory/subdirectory2 somedirectory/subdirectory3
Ini akan secara otomatis menghapus semua kecuali satu file dalam set duplikat dan akan menjamin bahwa jika set berisi file di
somedirectory/subdirectory1
dalamnya akan menjadi yang pertama, sehingga secara otomatis menjadi file yang diawetkan dalam set. Masih ada batasan mencolok untuk pendekatan ini seperti fakta bahwa duplikat lainsomedirectory/subdirectory1
mungkin dipertahankan daripada yang ingin Anda pertahankan, tetapi dalam sejumlah kasus seperti Anda,jdupes
opsi urutan parameter sebagai solusi sudah cukup baik.Dalam waktu dekat, saya berencana untuk menambahkan sistem pemfilteran
jdupes
yang akan memungkinkan sejumlah besar kontrol atas penyertaan / pengecualian file, pelestarian untuk-N
tindakan, dan penerapan "tumpukan filter" tersebut baik secara global atau per-parameter. Fitur ini sangat dibutuhkan; Saya membayangkan sesuatu seperti ini untuk "menghapus secara otomatis duplikat yang bukan nol tetapi TETAP selalu mempertahankansomedirectory/subdirectory1/somefile
apa adanya":jdupes -nrdN --filter=preserve:somedirectory/subdirectory1/somefile somedirectory/
sumber
Bagaimana dengan menghubungkan file duplikat bersama-sama? Dengan cara itu ruang hanya digunakan sekali, tetapi mereka masih ada di semua jalur. Yang menarik dari hal ini adalah bahwa file yang di-hardlink harus dimodifikasi di tempatnya (mereka hanya boleh dimodifikasi menghapus file dan membuatnya kembali dengan konten baru). Pendekatan lainnya adalah dengan symlink file bersama, meskipun Anda memiliki masalah yang sama memutuskan mana file "primer". Ini dapat dilakukan dengan skrip berikut (walaupun perhatikan bahwa ini tidak menangani nama file yang mengandung spasi).
sumber
jdupes
alih-alihfdupes
Anda hanya bisa pergijdupes -nrL somedirectory/
yang secara besar-besaran lebih cepat.Saya tidak melihat yang ini di tempat lain: Katakan apa yang Anda inginkan adalah ini. Anda memiliki / mnt / folder-tree-1 / mnt / folder-tree-2. Anda tidak ingin menghapus setiap dupe, tetapi jika file ada di tree-2, dan file identik ada di tree-1 dengan path dan nama yang persis sama, hapus dari tree-2.
Peringatan: ini cukup singkat dan jika Anda mencoba menyalin-menempelkan ini dengan keterampilan shell yang terbatas, berhati-hatilah.
Atau semua dalam satu baris:
Setelah itu, periksa dan jalankan rm-v2-dupes.sh
sumber
Saya punya pertanyaan yang sama. Jika Anda memiliki banyak duplikat
fdupes /my/directory/ -rdN
menyimpan file dengan tanggal modifikasi terlama, atau jika beberapa file memiliki tanggal modifikasi yang sama, maka yang ditemukan pertama kali.Jika tanggal modifikasi tidak penting bagi Anda, Anda dapat
touch
menyimpan file di direktori yang ingin Anda simpan. Jika Anda memilihtouch
mereka dengan tanggal dan waktu saat ini maka merekafdupes -rdNi
akan tetap dengan tanggal saat ini. Atau Anda dapattouch
menyimpan file dengan tanggal lebih awal dari tanggal yang ingin Anda hapus dan gunakanfdupes -rdN
seperti biasa.Jika Anda perlu menyimpan tanggal modifikasi, maka Anda harus menggunakan salah satu metode lain.
sumber
Hanya dengan menambahkan twist pada jawaban sebelumnya. Saya telah menggunakan kode berikut beberapa kali, sedikit memodifikasi jawaban sebelumnya dengan sederhana
| grep
untuk mengisolasi folder yang ingin saya hapus.Sekali lagi, ini akan membuat file sh untuk menghapus semua file yang terdaftar, tidak ada baris yang dikomentari. Tentu saja Anda masih dapat mengedit file untuk mengomentari baris / file tertentu yang ingin Anda pertahankan.
Petunjuk lain untuk direktori besar adalah menjalankan fdupes ke file txt, kemudian bereksperimen dengan
| grep
dan| sed
sampai saya mendapatkan hasil yang saya inginkan.sumber
Gunakan
sed
untuk membuat file shell yang akan berisi perintah komentar untuk menghapus setiap file duplikat Anda:File yang dihasilkan
remove-duplicate-files.sh
yang baru saja kita buat akan membuat setiap baris berkomentar. Batalkan komentar pada file yang ingin Anda hapus. Kemudian jalankansh remove-duplicate-files.sh
. Voila!MEMPERBARUI
Nah, jika Anda tidak ingin menghapus file hanya di direktori tertentu, sesederhana ini :
Dimana
exclude_duplicates.py
:File yang dihasilkan
remove-duplicate-files-keep-protected.sh
yang baru saja kita buat akan mengomentari semua file dari direktori yang dilindungi. Buka file ini di editor teks favorit Anda, periksa apakah semuanya OK. Kemudian jalankan. Voila!sumber
Bagaimana dengan sesuatu yang seperti ini?
sumber