Saya mencari cara yang mudah (perintah atau serangkaian perintah, mungkin melibatkan find
) untuk menemukan file duplikat di dua direktori, dan mengganti file dalam satu direktori dengan hardlink file di direktori lain.
Inilah situasinya: Ini adalah server file tempat banyak orang menyimpan file audio, masing-masing pengguna memiliki folder sendiri. Terkadang beberapa orang memiliki salinan file audio yang sama persis. Saat ini, ini adalah duplikat. Saya ingin membuatnya jadi hardlink, untuk menghemat ruang hard drive.
Jawaban:
Ada skrip perl di http://cpansearch.perl.org/src/ANDK/Perl-Repository-APC-2.002/eg/trimtrees.pl yang melakukan apa yang Anda inginkan:
sumber
rdfind
tersedia melalui manajer paket untuk SEMUA platform utama (os x, linux, (cyg) win, solaris), dan bekerja pada kecepatan asli yang sangat tinggi. Jadi, silakan periksa jawabannya di bawah ini.[Errno 31] Too many links
. Script ini tampaknya menjadi satu-satunya yang menangani itu.rdfind
tidak persis apa yang Anda minta (dan dalam urutan johny mengapa daftar). Memungkinkan untuk menghapus duplikat, menggantinya dengan tautan lunak atau keras. Digabungkan dengansymlinks
Anda juga dapat membuat symlink baik absolut maupun relatif. Anda bahkan dapat memilih algoritma checksum (md5 atau sha1).Karena dikompilasi, ini lebih cepat daripada kebanyakan solusi skrip:
time
pada folder 15 GiB dengan 2600 file di Mac Mini dari 2009 mengembalikan ini(menggunakan md5).
Tersedia di sebagian besar penangan paket (mis. MacPort untuk Mac OS X).
sumber
rdfind
dan menyukainya. Ini memiliki-dryrun true
opsi yang akan memberi tahu Anda apa yang akan dilakukan. Mengganti duplikat dengan tautan keras semudah-makehardlinks true
. Ini menghasilkan log yang bagus dan biarkan saya tahu berapa banyak ruang yang dibebaskan. Plus, menurut tolok ukur penulis , rdfind lebih cepat daripada duff dan fslint.Gunakan
fdupes
alat ini:fdupes -r /path/to/folder
memberi Anda daftar duplikat di direktori (-r membuatnya rekursif). Outputnya terlihat seperti ini:filename1
filename2
filename3
filename4
filename5
dengan filename1 dan filename2 menjadi identik dan filename3, filename4 dan filename5 juga identik.
sumber
rdfind
- sukafdupes
, tetapi lebih cepat dan tersedia di OS X dan Cygwin juga.fdupes
tampaknya hanya menemukan duplikat, bukan menggantinya dengan hardlink, jadi bukan jawaban untuk pertanyaan IMO.jdupes
berdasarkanfdupes
, tetapi juga dapat mengganti file duplikat dengan symlinks (-l
), hardlinks (-L
) atau memerintahkan btrfs untuk mendupuplikasi blok pada tingkat sistem file (-B
, jika Anda menggunakan btrfs).Saya menggunakan
hardlink
dari http://jak-linux.org/projects/hardlink/sumber
hardlink
di Fedora / RHEL / dll.hardlink
sekarang biner asli di banyak sistem paket Linux (sejak ~ 2014) dan sangat cepat. Untuk file 1,2M (320GB), hanya butuh 200 detik (menghubungkan sekitar 10% file).hardlink
diciptakan oleh Julian Andres Klode sementara Fedorahardlink
diciptakan oleh Jakub Jelinek (sumber: pagure.io/hardlink - nama paket Fedora: hardlink)Ini adalah salah satu fungsi yang disediakan oleh "fslint" - http://en.flossmanuals.net/FSlint/Introduction
Klik tombol "Gabung":
sumber
sudo apt-get install fslint
/usr/share/fslint/fslint/findup -m /your/directory/tree
(direktori / usr / share / fslint / fslint / secara default bukan dalam $ PATH)Karena target utama Anda adalah untuk menghemat ruang disk, ada solusi lain: de-duplikasi (dan mungkin kompresi) pada tingkat sistem file. Dibandingkan dengan solusi hard-link, itu tidak memiliki masalah yang secara tidak sengaja mempengaruhi file tertaut lainnya.
ZFS memiliki dedup (level blok, bukan level file) sejak kumpulan versi 23 dan kompresi sejak lama. Jika Anda menggunakan linux, Anda dapat mencoba zfs-fuse , atau jika Anda menggunakan BSD, ia didukung secara native.
sumber
btrfs
gunakan deduplikasi batch atau offline (jalankan setiap kali Anda menganggapnya berguna / diperlukan) btrfs.wiki.kernel.org/index.php/Dupuplikasirsync --inplace
hanya blok yang diubah yang disimpan)Pada Linux modern sekarang ini ada https://github.com/g2p/bedup yang menduplikasi pada sistem file btrfs, tetapi 1) tanpa banyak overhead pemindaian, 2) file dapat menyimpang dengan mudah lagi setelahnya.
sumber
cp --reflink
, lihat juga di bawah)Untuk menemukan file duplikat, Anda dapat menggunakan duff .
Cukup jalankan:
Untuk membuat hardlink ke file-file itu secara otomatis, Anda perlu mengurai output dari duff dengan bash atau bahasa scripting lainnya.
sumber
Deskripsi: Hardlink banyak salinan dari file yang sama Hardlink adalah alat yang mendeteksi banyak salinan dari file yang sama dan menggantinya dengan hardlink.
Idenya telah diambil dari http://code.google.com/p/hardlinkpy/ , tetapi kode tersebut telah ditulis dari awal dan dilisensikan di bawah lisensi MIT. Beranda: http://jak-linux.org/projects/hardlink/
sumber
Saya telah menggunakan banyak alat hardlink untuk Linux yang disebutkan di sini. Saya juga terjebak dengan ext4 fs, di Ubuntu, dan telah menggunakan cp -l dan -s untuk hard / softlinking. Tetapi akhir-akhir ini memperhatikan salinan ringan di halaman manual cp , yang akan menyiratkan cadangan ruang disk yang berlebihan sampai satu sisi diubah:
sumber
cp
alias saya untuk selalu menyertakan--reflink=auto
parameter sekarang--reflink
?Menurut saya, memeriksa nama file terlebih dahulu bisa mempercepat. Jika dua file tidak memiliki nama file yang sama maka dalam banyak kasus saya tidak akan menganggapnya sebagai duplikat. Tampaknya metode tercepat adalah membandingkan, dengan urutan:
Apakah ada metode yang melakukan ini? Lihatlah
duff
,fdupes
,rmlint
,fslint
, dllMetode berikut ini terpilih pada commandlinefu.com : Temukan File Duplikat (berdasarkan ukuran pertama, lalu hash MD5)
Bisakah perbandingan nama file ditambahkan sebagai langkah pertama, ukuran sebagai langkah kedua?
sumber
duff
,fdupes
danrmlint
, dan sangat menyarankan pembaca untuk melihat ketiga hal ini . Ini memiliki set pilihan yang sangat baik (dan dokumentasi). Dengan itu, saya bisa menghindari banyak post-processing yang perlu saya gunakan dengan alat-alat lain.install.sh
file yang dapat ditemukan pada sistem yang aktif? Saya tidak dapat menghitung berapa kali saya menyimpan file dan memiliki bentrokan nama, dengan beberapa penggantian nama saat itu untuk menyimpannya. Sisi lain: tidak tahu berapa kali saya mengunduh sesuatu dari sumber yang berbeda, pada hari yang berbeda, hanya untuk menemukan mereka adalah file yang sama dengan nama yang berbeda. (Yang juga membunuh keandalan cap waktu.) 1: Ukuran, 2: Intisari, 3: konten Byte.Karena saya bukan penggemar Perl, inilah versi bash:
Ini menemukan semua file dengan checksum yang sama (apakah itu besar, kecil, atau sudah hardlink), dan hardlink mereka bersama-sama.
Ini dapat sangat dioptimalkan untuk pengulangan yang dijalankan dengan flag-flag find tambahan (mis. Ukuran) dan cache file (sehingga Anda tidak perlu mengulang checksum setiap kali). Jika ada yang tertarik dengan versi yang lebih pintar dan lebih lama, saya dapat mempostingnya.
CATATAN: Seperti yang telah disebutkan sebelumnya, hardlink berfungsi selama file tidak perlu modifikasi, atau dipindahkan melintasi filesystem.
sumber
rdfind
, yang bekerja pada kecepatan asli dan hanya membutuhkanbrew install rdfind
atauapt-get install rdfind
dipasang.Saya membuat skrip Perl yang melakukan sesuatu yang mirip dengan yang Anda bicarakan:
http://pastebin.com/U7mFHZU7
Pada dasarnya, itu hanya melintasi sebuah direktori, menghitung SHA1sum dari file di dalamnya, hashing dan menautkan pertandingan bersama. Ini sangat berguna pada banyak kesempatan.
sumber
Jika Anda ingin mengganti duplikat dengan Tautan Keras di mac atau sistem berbasis UNIX, Anda dapat mencoba SmartDupe http://sourceforge.net/projects/smartdupe/ sedang mengembangkannya
sumber
Applicos FSLint ( http://www.pixelbeat.org/fslint/ ) dapat menemukan semua file yang sama dalam folder apa saja (berdasarkan konten) dan membuat hardlink. Cobalah!
Jorge Sampaio
sumber
jdupes
telah disebutkan dalam komentar tetapi layak mendapatkan jawabannya sendiri, karena mungkin tersedia di sebagian besar distribusi dan berjalan cukup cepat (hanya membebaskan 2,7 GB dari partisi penuh 158 GB (drive SSD) 98% dalam waktu sekitar satu menit):sumber
Jika Anda akan melakukan hardlink, perhatikan hak pada file itu. Pemberitahuan, pemilik, grup, mode, atribut yang diperluas, waktu dan ACL (jika Anda menggunakan ini) disimpan dalam INODE. Hanya nama file yang berbeda karena ini disimpan dalam struktur direktori, dan menunjuk ke properti INODE lainnya. Penyebab ini, semua nama file yang terhubung ke inode yang sama, memiliki hak akses yang sama. Anda harus mencegah modifikasi file itu, karena setiap pengguna dapat merusak file yang lain. Sederhana saja. Sudah cukup, setiap pengguna menaruh file lain dengan nama yang sama. Nomor inode kemudian disimpan, dan konten file asli dihancurkan (diganti) untuk semua nama yang di-hardlink.
Cara yang lebih baik adalah deduplikasi pada layer filesystem. Anda dapat menggunakan BTRFS (terakhir kali sangat populer), OCFS atau seperti ini. Lihat halaman: https://en.wikipedia.org/wiki/Comparison_of_file_systems , khususnya di tabel Fitur dan deduplikasi data kolom. Anda dapat mengkliknya dan mengurutkan :)
Khususnya melihat sistem file ZFS. Ini tersedia sebagai FUSE, tetapi dengan cara ini sangat lambat. Jika Anda ingin dukungan asli, lihat halaman http://zfsonlinux.org/ . Kemudian Anda harus menambal kernel, dan menginstal alat zfs untuk manajemen. Saya tidak mengerti, mengapa linux tidak mendukung driver, itu adalah cara untuk banyak sistem operasi / kernel.
Sistem file mendukung deduplikasi dengan 2 cara, deduplikasi file, atau blok. ZFS mendukung blok. Ini berarti, konten yang sama yang berulang dalam file yang sama dapat dideduplikasi. Cara lain adalah waktu ketika data dideduplikasi, ini bisa online (zfs) atau offline (btrfs).
Perhatikan, deduplikasi mengkonsumsi RAM. Inilah sebabnya mengapa menulis file ke volume ZFS yang dipasang dengan FUSE, menyebabkan kinerja yang sangat lambat. Ini dijelaskan dalam dokumentasi. Tetapi Anda dapat secara online mengaktifkan / menonaktifkan deduplikasi volume. Jika Anda melihat ada data yang harus dideduplikasi, Anda cukup mengaktifkan deduplikasi, menulis ulang beberapa file untuk sementara dan akhirnya mengganti. setelah ini, Anda dapat mematikan deduplikasi dan mengembalikan kinerja penuh. Tentu saja, Anda dapat menambahkan ke penyimpanan disk cache apa pun. Ini bisa menjadi disk putar sangat cepat atau disk SSD. Tentu saja ini bisa menjadi disk yang sangat kecil. Dalam pekerjaan nyata ini adalah pengganti RAM :)
Di linux Anda harus berhati-hati untuk ZFS karena tidak semua berfungsi sebagaimana mestinya, khususnya ketika Anda mengelola sistem file, membuat snapshot dll. Tetapi jika Anda melakukan konfigurasi dan tidak mengubahnya, semua berfungsi dengan baik. Cara lain, Anda harus mengubah linux ke opensolaris, itu secara alami mendukung ZFS :) Apa yang sangat baik dengan ZFS adalah, ini berfungsi baik sebagai sistem file, dan manajer volumen mirip dengan LVM. Anda tidak membutuhkannya saat menggunakan ZFS. Lihat dokumentasi jika Anda ingin tahu lebih banyak.
Perhatikan perbedaan antara ZFS dan BTRFS. ZFS lebih tua dan lebih dewasa, sayangnya hanya di bawah Solaris dan OpenSolaris (sayangnya dicekik oleh oracle). BTRFS lebih muda, tetapi terakhir kali sangat baik didukung. Saya merekomendasikan kernel segar. ZFS memiliki deduplikasi online, yang menyebabkan menulis lambat, karena semua dihitung secara online. BTRFS mendukung dedupliaksi offline. Maka ini menghemat kinerja, tetapi ketika tuan rumah tidak ada hubungannya, Anda menjalankan alat secara berkala untuk melakukan deduplikasi. Dan BTRFS dibuat secara native di bawah linux. Mungkin ini FS yang lebih baik untuk Anda :)
sumber
btrfs
. Diskusi yang luar biasa mengenai opsi-opsi (termasukcp --reflink
opsi) di sini: btrfs.wiki.kernel.org/index.php/DeduplicationHard link mungkin bukan ide terbaik; jika satu pengguna mengubah file, itu mempengaruhi keduanya. Namun, menghapus tautan keras tidak menghapus kedua file. Selain itu, saya tidak sepenuhnya yakin apakah Hard Links mengambil jumlah ruang yang sama (pada hard disk, bukan OS) seperti banyak salinan dari file yang sama; menurut Windows (dengan Ekstensi Shell Link), mereka melakukannya. Memang, itu Windows, bukan Unix ...
Solusi saya adalah membuat file "umum" di folder tersembunyi, dan mengganti duplikat yang sebenarnya dengan tautan simbolis ... kemudian, tautan simbolis akan disematkan dengan metadata atau aliran file alternatif yang hanya merekam namun kedua "file" itu. berbeda satu sama lain, seperti jika satu orang ingin mengubah nama file atau menambahkan seni album kustom atau yang lain seperti itu; bahkan mungkin berguna di luar aplikasi basis data, seperti memiliki beberapa versi dari permainan atau perangkat lunak yang sama diinstal dan mengujinya secara mandiri dengan perbedaan terkecil sekalipun.
sumber
Cara termudah adalah menggunakan dupeGuru program khusus
seperti kata dokumentasi
sumber