it-swarm-id.com

Apakah ada cara mudah untuk mengganti file duplikat dengan hardlink?

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.

146
Josh

Ada skrip Perl di http://cpansearch.Perl.org/src/ANDK/Perl-Repository-APC-2.002/eg/trimtrees.pl yang melakukan persis seperti yang Anda inginkan:

Lintasi semua direktori yang disebutkan pada baris perintah, hitung checksum MD5 dan temukan file dengan MD5 identik. JIKA mereka sama, lakukan perbandingan nyata jika mereka benar-benar sama, ganti yang kedua dari dua file dengan tautan keras ke yang pertama.

42
fschmitt

rdfind melakukan persis apa yang Anda minta (dan dalam urutan johny mengapa daftar). Memungkinkan untuk menghapus duplikat, menggantinya dengan tautan lunak atau keras. Digabungkan dengan symlinks 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 yang dituliskan: time pada 15 GiB folder dengan 2600 file di Mac Mini dari 2009 mengembalikan ini

9.99s user 3.61s system 66% cpu 20.543 total

(menggunakan md5).

Tersedia di sebagian besar penangan paket (mis. MacPort untuk Mac OS X).

98
d-b

Gunakan alat fdupes:

fdupes -r /path/to/folder memberi Anda daftar duplikat di direktori (-r membuatnya rekursif). Outputnya terlihat seperti ini:


namafile1
namafile2

filename3
namafile4
nama file5


dengan filename1 dan filename2 identik dan filename3, filename4 dan filename5 juga identik.

51
tante

Saya menggunakan hardlink dari http://jak-linux.org/projects/hardlink/

24
waltinator

Ini adalah salah satu fungsi yang disediakan oleh "fslint" - http://en.flossmanuals.net/FSlint/Introduction

Klik tombol "Gabung":

Screenshot

18
LJ Wobker

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.

14
Wei-Yin

Di Linux modern akhir-akhir ini ada https://github.com/g2p/bedup yang menduplikasi pada sistem file btrfs, tetapi 1) tanpa banyak overhead pemindaian, 2) file dapat berbeda dengan mudah lagi sesudahnya.

7
Matthew Bloch
aptitude show hardlink

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 telah ditulis dari awal dan dilisensikan di bawah MIT lisensi. Situs web: http://jak-linux.org/projects/hardlink/

6
Julien Palard

Untuk menemukan file duplikat, Anda dapat menggunakan duff.

Duff adalah utilitas baris perintah Unix untuk menemukan duplikat dengan cepat dalam kumpulan file yang diberikan.

Cukup jalankan:

duff -r target-folder

Untuk membuat hardlink ke file-file itu secara otomatis, Anda perlu mengurai output duff dengan bash atau skrip lain bahasa.

6
Stefan

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 hingga satu sisi akan dimodifikasi:

   --reflink[=WHEN]
          control clone/CoW copies. See below

       When  --reflink[=always]  is specified, perform a lightweight copy, where the 
data blocks are copied only when modified.  If this is not possible the
       copy fails, or if --reflink=auto is specified, fall back to a standard copy.
4
Marcos

jdupes telah disebutkan dalam komentar tetapi layak untuk dijawab sendiri, karena mungkin tersedia di sebagian besar distribusi dan berjalan cukup cepat (hanya membebaskan 2,7GB dari partisi penuh 158GB 98% (drive SSD) sekitar 98% di sekitar satu menit) :

jdupes -rL /foo/bar

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:

  • nama file
  • ukuran
  • md5 checksum
  • konten byte

Apakah ada metode yang melakukan ini? Lihatlah duff, fdupes, rmlint, fslint, dll.

Metode berikut terpilih pada commandlinefu.com : Temukan File Duplikat (berdasarkan pada ukuran pertama, lalu hash MD5)

Bisakah perbandingan nama file ditambahkan sebagai langkah pertama, ukuran sebagai langkah kedua?

find -not -empty -type f -printf "%s\n" | sort -rn | uniq -d | \
  xargs -I{} -n1 find -type f -size {}c -print0 | xargs -0 md5sum | \
  sort | uniq -w32 --all-repeated=separate
4
johny why

Karena saya bukan penggemar Perl, inilah versi bash:

#!/bin/bash

DIR="/path/to/big/files"

find $DIR -type f -exec md5sum {} \; | sort > /tmp/sums-sorted.txt

OLDSUM=""
IFS=$'\n'
for i in `cat /tmp/sums-sorted.txt`; do
 NEWSUM=`echo "$i" | sed 's/ .*//'`
 NEWFILE=`echo "$i" | sed 's/^[^ ]* *//'`
 if [ "$OLDSUM" == "$NEWSUM" ]; then
  echo ln -f "$OLDFILE" "$NEWFILE"
 else
  OLDSUM="$NEWSUM"
  OLDFILE="$NEWFILE"
 fi
done

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 proses yang berulang-ulang dengan flag-flag find tambahan (mis. Ukuran) dan cache file (jadi 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.

3
seren

Jika Anda ingin mengganti duplikat dengan Tautan Keras di mac atau sistem berbasis UNIX apa pun, Anda dapat mencoba SmartDupe http://sourceforge.net/projects/smartdupe/ sedang mengembangkannya

1
islam

Saya membuat skrip Perl yang melakukan sesuatu yang mirip dengan yang Anda bicarakan:

http://Pastebin.com/U7mFHZU7

Pada dasarnya, ini hanya melintasi direktori, menghitung SHA1sum dari file di dalamnya, hashing dan menghubungkan pertandingan bersama. Ini sangat berguna pada banyak kesempatan.

1
amphetamachine

Aplikasi FSLint ( http://www.pixelbeat.org/fslint/ ) dapat menemukan semua file yang sama dalam folder apa pun (berdasarkan konten) dan membuat hardlink. Cobalah!

Jorge Sampaio

1

Hard link mungkin bukan ide terbaik; jika satu pengguna mengubah file, itu mempengaruhi keduanya. Namun, menghapus tautan keras tidak menghapus kedua file. Plus, 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" dalam 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 menginstal beberapa versi dari permainan atau perangkat lunak yang sama dan mengujinya secara mandiri dengan perbedaan terkecil sekalipun.

0
Amaroq Starwind

Jika Anda akan melakukan hardlink, perhatikan hak-hak pada file itu. Pemberitahuan, pemilik, grup, mode, atribut tambahan, 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 menginginkan 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 sebagai 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 diulang 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 data apa pun 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 untuk 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 Host tidak ada hubungannya, Anda menjalankan alat secara berkala untuk melakukan deduplikasi. Dan BTRFS dibuat secara native di bawah linux. Mungkin ini lebih baik FS untuk Anda :)

0
Znik

Cara termudah adalah dengan menggunakan dupeGuru program khusus

dupeGuru Preferences Screenshot

sebagai dokumentasi kata

Opsi Penghapusan

Opsi ini memengaruhi bagaimana penghapusan duplikat terjadi. Sebagian besar waktu, Anda tidak perlu mengaktifkan salah satu dari mereka.

Tautkan file yang dihapus:

File yang dihapus diganti dengan tautan ke file referensi. Anda memiliki pilihan untuk menggantinya dengan symlink atau hardlink. ... symlink adalah pintasan ke jalur file. Jika file asli dihapus atau dipindahkan, tautannya rusak. Hardlink adalah tautan ke file itu sendiri. Tautan itu sebagus file "asli". Hanya ketika semua hardlinks ke file dihapus adalah file itu sendiri dihapus.

Di OSX dan Linux, fitur ini didukung sepenuhnya, tetapi di bawah Windows, ini sedikit rumit. Windows XP tidak mendukungnya, tetapi Vista dan lebih tinggi mendukungnya. Namun, agar fitur berfungsi, dupeGuru harus dijalankan dengan hak administratif.