Bagaimana cara mengganti semua file duplikat dengan tautan keras?

20

Saya memiliki dua folder yang berisi berbagai file. Beberapa file dari folder pertama memiliki salinan persis di folder kedua. Saya ingin mengganti yang dengan tautan keras. Bagaimana saya bisa melakukan itu?

qdii
sumber
2
Harap berikan OS dan sistem file.
Steven
Yah, saya menggunakan ext4 di ubuntu 15.04, tetapi jika seseorang memberikan jawaban untuk OS lain, saya yakin itu dapat bermanfaat bagi seseorang yang membaca pertanyaan ini.
qdii
Berikut adalah duplikat pertanyaan pada Unix.SE .
Alexey

Jawaban:

20

Saya tahu 4 solusi command-line untuk linux. Pilihan saya adalah yang terakhir yang tercantum di sini rdfind, karena semua opsi tersedia.

fdupes

  • Tampaknya ini yang paling direkomendasikan / paling terkenal.
  • Ini paling sederhana untuk digunakan, tetapi satu-satunya tindakan adalah menghapus duplikat.
  • Untuk memastikan duplikat benar-benar duplikat (walaupun tidak selamanya berjalan), perbandingan antara file dilakukan pertama kali dengan ukuran file, kemudian hash md5, kemudian perbandingan bye-by-byte.

Output sampel (dengan opsi "tampilkan ukuran", "rekursif"):

$ fdupes -Sr .
17 bytes each:                          
./Dir1/Some File
./Dir2/SomeFile

hardlink

  • Dirancang untuk, seperti namanya, mengganti file yang ditemukan dengan hardlink.
  • Memiliki --dry-runopsi.
  • Tidak menunjukkan bagaimana konten dibandingkan, tetapi tidak seperti semua opsi lain, memang memperhitungkan mode file akun, pemilik, dan waktu yang dimodifikasi.

Output sampel (perhatikan bagaimana kedua file saya memiliki waktu modifikasi yang sedikit berbeda, jadi pada putaran kedua saya katakan untuk mengabaikannya):

$ stat Dir*/* | grep Modify
Modify: 2015-09-06 23:51:38.784637949 -0500
Modify: 2015-09-06 23:51:47.488638188 -0500

$ hardlink --dry-run -v .
Mode:     dry-run
Files:    5
Linked:   0 files
Compared: 0 files
Saved:    0 bytes
Duration: 0.00 seconds

$ hardlink --dry-run -v -t .
[DryRun] Linking ./Dir2/SomeFile to ./Dir1/Some File (-17 bytes)
Mode:     dry-run
Files:    5
Linked:   1 files
Compared: 1 files
Saved:    17 bytes
Duration: 0.00 seconds

duff

  • Dibuat untuk menemukan file yang kemudian ditindaklanjuti oleh pengguna; tidak memiliki tindakan.
  • Perbandingan dilakukan berdasarkan ukuran file, lalu sha1 hash.
    • Hash dapat diubah ke sha256, sha384, atau sha512.
    • Hash dapat dinonaktifkan untuk melakukan perbandingan byte-by-byte

Output sampel (dengan opsi "rekursif"):

$ duff -r .
2 files in cluster 1 (17 bytes, digest 34e744e5268c613316756c679143890df3675cbb)
./Dir2/SomeFile
./Dir1/Some File

rdfind

  • Opsi memiliki sintaks yang tidak biasa (dimaksudkan untuk meniru find?).
  • Beberapa opsi untuk mengambil file duplikat (hapus, buat symlink, buat hardlink).
  • Memiliki mode dry-run.
  • Perbandingan dilakukan berdasarkan ukuran file, lalu byte pertama, lalu byte terakhir, lalu md5 (default) atau sha1.
  • Peringkat file yang ditemukan membuatnya dapat diprediksi file mana yang dianggap asli.

Output sampel:

$ rdfind -dryrun true -makehardlinks true .
(DRYRUN MODE) Now scanning ".", found 5 files.
(DRYRUN MODE) Now have 5 files in total.
(DRYRUN MODE) Removed 0 files due to nonunique device and inode.
(DRYRUN MODE) Now removing files with zero size from list...removed 0 files
(DRYRUN MODE) Total size is 13341 bytes or 13 kib
(DRYRUN MODE) Now sorting on size:removed 3 files due to unique sizes from list.2 files left.
(DRYRUN MODE) Now eliminating candidates based on first bytes:removed 0 files from list.2 files left.
(DRYRUN MODE) Now eliminating candidates based on last bytes:removed 0 files from list.2 files left.
(DRYRUN MODE) Now eliminating candidates based on md5 checksum:removed 0 files from list.2 files left.
(DRYRUN MODE) It seems like you have 2 files that are not unique
(DRYRUN MODE) Totally, 17 b can be reduced.
(DRYRUN MODE) Now making results file results.txt
(DRYRUN MODE) Now making hard links.
hardlink ./Dir1/Some File to ./Dir2/SomeFile
Making 1 links.

$ cat results.txt 
# Automatically generated
# duptype id depth size device inode priority name
DUPTYPE_FIRST_OCCURRENCE 1 1 17 2055 24916405 1 ./Dir2/SomeFile
DUPTYPE_WITHIN_SAME_TREE -1 1 17 2055 24916406 1 ./Dir1/Some File
# end of file
Izkata
sumber
1
"lalu md5 (default) atau sha1." Itu tidak berarti file tersebut identik. Karena menghitung hash membutuhkan program untuk membaca seluruh file, itu harus membandingkan seluruh file byte-untuk-byte. Menghemat waktu CPU juga.
endolit
@endolith Itu sebabnya Anda selalu mulai dengan dry-run, untuk melihat apa yang akan terjadi ...
Izkata
1
Tetapi inti dari perangkat lunak ini adalah untuk mengidentifikasi file duplikat untuk Anda. Jika Anda harus secara manual memeriksa ulang apakah file tersebut benar-benar duplikat, maka itu tidak baik.
Endolith
2
Jika Anda memiliki n file dengan ukuran, byte pertama, dan akhir byte yang identik , tetapi semuanya berbeda, menentukan bahwa dengan perbandingan langsung memerlukan n ! perbandingan pasangan. Hashing mereka semua kemudian membandingkan hash cenderung lebih cepat, terutama untuk file besar dan / atau file dalam jumlah besar. Apa pun yang lolos filter itu dapat melanjutkan untuk melakukan perbandingan langsung untuk memverifikasi. (Atau gunakan hash yang lebih baik untuk memulai.)
Alan De Smet
6

Duplicate Commander adalah solusi yang memungkinkan pada Windows:

Duplicate Commander adalah aplikasi freeware yang memungkinkan Anda menemukan dan mengelola file duplikat di PC Anda. Duplicate Commander hadir dengan banyak fitur dan alat yang memungkinkan Anda untuk memulihkan ruang disk Anda dari duplikat tersebut.

Fitur:

Replacing files with hard links
Replacing files with soft links
... (and many more) ...

1

Untuk Linux Anda dapat menemukan skrip Bash di sini .

Karan
sumber
2

Duplicate & Same File Searcher adalah solusi lain untuk Windows:

Duplicate & Same Files Searcher (Duplicate Searcher) adalah aplikasi untuk mencari file duplikat (klon) dan tautan keras NTFS ke file yang sama. Itu mencari duplikat konten file terlepas dari nama file (perbandingan byte-ke-byte yang benar digunakan). Aplikasi ini memungkinkan tidak hanya untuk menghapus file duplikat atau memindahkannya ke lokasi lain, tetapi juga untuk mengganti duplikat dengan tautan keras NTFS (unik!)

masukkan deskripsi gambar di sini

Greck
sumber
1

Saya memiliki alat gratis yang bagus di komputer saya yang disebut Link Shell Extension; tidak hanya bagus untuk membuat Hard Links dan Symbolic Links, tetapi juga persimpangan! Selain itu, ditambahkan ikon kustom yang memungkinkan Anda untuk dengan mudah mengidentifikasi berbagai jenis tautan, bahkan yang sudah ada sebelum instalasi; Panah Merah mewakili Hard Links misalnya, sedangkan Hijau mewakili Symbolic Links ... dan rantai mewakili Persimpangan.

Sayangnya saya menghapus instalan perangkat lunak beberapa waktu lalu (dalam-massal penghapusan berbagai program), jadi saya tidak dapat membuat tautan lagi secara manual, tetapi ikon masih muncul secara otomatis setiap kali Windows mendeteksi tautan Hard, Symbolic atau Junction.

Amaroq Starwind
sumber
1

Saya sangat merekomendasikan jdupes . Ini adalah garpu yang ditingkatkan dari fdupes , tetapi juga termasuk:

  • sekelompok opsi baris perintah baru - termasuk --linkhard, atau -Lsingkatnya
  • dukungan asli untuk semua platform OS utama
  • Kecepatan dikatakan lebih dari 7 kali lebih cepat dari rata-rata fdupes

Untuk pertanyaan Anda, Anda bisa menjalankannya $ jdupes -L /path/to/your/files.

Anda mungkin ingin mengkloning dan membangun sumber terbaru dari repo GitHub -nya karena proyek ini masih dalam pengembangan aktif. Binari Windows juga disediakan di sini. Binari terpaket tersedia di beberapa distro Linux / BSD - sebenarnya saya pertama kali menemukannya $ apt search.

Arnie97
sumber