Làm thế nào để thay thế tất cả các tập tin trùng lặp với các liên kết cứng?


20

Tôi có hai thư mục chứa các tập tin khác nhau. Một số tệp từ thư mục đầu tiên có một bản sao chính xác trong thư mục thứ hai. Tôi muốn thay thế những người có một liên kết cứng. Làm thế nào tôi có thể làm điều đó?


2
Vui lòng cung cấp hệ điều hành và hệ thống tập tin.
Steven

Chà, tôi sử dụng ext4 trên Ubuntu 15.04, nhưng nếu ai đó cung cấp câu trả lời cho một HĐH khác, tôi chắc chắn nó có thể hữu ích cho ai đó đang đọc câu hỏi này.
qdii

Câu trả lời:


20

Tôi biết 4 giải pháp dòng lệnh cho linux. Cái ưa thích của tôi là cái cuối cùng được liệt kê ở đây rdfind, bởi vì tất cả các tùy chọn có sẵn.

fdupes

  • Điều này dường như là một đề nghị nhất / nổi tiếng nhất.
  • Đây là cách đơn giản nhất để sử dụng, nhưng hành động duy nhất của nó là xóa các bản sao.
  • Để đảm bảo các bản sao thực sự là các bản sao (trong khi không chạy mãi mãi), việc so sánh giữa các tệp được thực hiện trước tiên bằng kích thước tệp, sau đó băm md5, sau đó so sánh theo byte.

Đầu ra mẫu (với các tùy chọn "hiển thị kích thước", "đệ quy"):

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

liên kết cứng

  • Được thiết kế để, như tên cho thấy, thay thế các tập tin tìm thấy bằng các liên kết cứng.
  • Có một --dry-runlựa chọn.
  • Không cho biết cách so sánh nội dung, nhưng không giống như tất cả các tùy chọn khác, có tính đến chế độ tệp tài khoản, chủ sở hữu và thời gian sửa đổi.

Đầu ra mẫu (lưu ý cách hai tệp của tôi có thời gian sửa đổi hơi khác nhau, vì vậy trong lần chạy thứ hai, tôi bảo nó bỏ qua điều đó):

$ 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

  • Được thực hiện để tìm các tệp mà người dùng sau đó hành động; không có hành động có sẵn.
  • Việc so sánh được thực hiện theo kích thước tệp, sau đó băm sha1.
    • Hash có thể được thay đổi thành sha256, sha384 hoặc sha512.
    • Hash có thể bị vô hiệu hóa để thực hiện so sánh theo từng byte

Đầu ra mẫu (với tùy chọn "đệ quy"):

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

báo cáo lại

  • Các tùy chọn có một cú pháp bất thường (có nghĩa là bắt chước find?).
  • Một số tùy chọn cho các hành động để thực hiện các tệp trùng lặp (xóa, tạo liên kết tượng trưng, ​​tạo liên kết cứng).
  • Có chế độ chạy khô.
  • Việc so sánh được thực hiện theo kích thước tệp, sau đó là byte đầu tiên, sau đó là byte cuối cùng, sau đó là md5 (mặc định) hoặc sha1.
  • Xếp hạng các tập tin được tìm thấy làm cho nó có thể dự đoán được tập tin nào được coi là bản gốc.

Đầu ra mẫu:

$ 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

1
"sau đó hoặc md5 (mặc định) hoặc sha1." Điều đó không có nghĩa là các tập tin là giống hệt nhau. Vì việc tính toán một hàm băm yêu cầu chương trình phải đọc toàn bộ tệp bằng mọi cách, nên nó chỉ nên so sánh toàn bộ tệp theo từng byte. Tiết kiệm thời gian CPU, quá.
endolith

@endolith Đó là lý do tại sao bạn luôn bắt đầu với chạy khô, để xem điều gì sẽ xảy ra ...
Izkata

1
Nhưng quan điểm của phần mềm là xác định các tệp trùng lặp cho bạn. Nếu bạn phải kiểm tra lại một cách thủ công rằng các tệp thực sự trùng lặp, thì không tốt.
endolith


2
Nếu bạn có n file với kích thước giống hệt nhau, đầu tiên-byte, cuối byte, nhưng tất cả họ đều khác nhau, xác định rằng bằng cách so sánh trực tiếp đòi hỏi n ! cặp so sánh. Băm tất cả chúng sau đó so sánh băm có thể sẽ nhanh hơn nhiều, đặc biệt là đối với các tệp lớn và / hoặc số lượng lớn tệp. Bất kỳ bộ lọc nào vượt qua bộ lọc đó đều có thể tiếp tục so sánh trực tiếp để xác minh. (Hoặc chỉ sử dụng hàm băm tốt hơn để bắt đầu.)
Alan De Smet

6

Chỉ huy trùng lặp là một giải pháp khả thi trên Windows:

Copyate Commander là một ứng dụng phần mềm miễn phí cho phép bạn tìm và quản lý các tệp trùng lặp trên PC. Chỉ huy trùng lặp đi kèm với nhiều tính năng và công cụ cho phép bạn khôi phục dung lượng ổ đĩa của mình từ những bản sao đó.

Tính năng, đặc điểm:

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

1

Đối với Linux, bạn có thể tìm thấy một tập lệnh Bash tại đây .


2

Trình tìm kiếm trùng lặp và cùng tệp là một giải pháp khác trên Windows:

Trình tìm kiếm trùng lặp và cùng tệp (Trình tìm kiếm trùng lặp) là một ứng dụng để tìm kiếm các tệp trùng lặp (bản sao) và các liên kết cứng NTFS đến cùng một tệp. Nó tìm kiếm nội dung tệp trùng lặp bất kể tên tệp (so sánh byte-byte thực được sử dụng). Ứng dụng này không chỉ cho phép xóa các tệp trùng lặp hoặc di chuyển chúng sang vị trí khác mà còn thay thế các bản sao bằng các liên kết cứng NTFS (duy nhất!)

nhập mô tả hình ảnh ở đây


1

Tôi đã có một công cụ miễn phí tiện lợi trên máy tính của mình có tên là Link Shell Extension; không chỉ tuyệt vời khi tạo Liên kết cứng và Liên kết tượng trưng, ​​mà cả Liên kết nữa! Ngoài ra, nó đã thêm các biểu tượng tùy chỉnh cho phép bạn dễ dàng xác định các loại liên kết khác nhau, ngay cả những liên kết đã tồn tại trước khi cài đặt; Ví dụ, Mũi tên đỏ đại diện cho Liên kết cứng, trong khi Màu xanh lá cây đại diện cho Liên kết tượng trưng ... và chuỗi đại diện cho Liên kết.

Tôi không may gỡ cài đặt phần mềm một lúc trước (trong quá trình gỡ cài đặt hàng loạt các chương trình khác nhau), vì vậy tôi không thể tạo các liên kết nữa theo cách thủ công, nhưng các biểu tượng vẫn tự động hiển thị mỗi khi Windows phát hiện liên kết Hard, Symbolic hoặc Junction.


1

Tôi rất khuyên bạn nên jdupes . Nó là một nhánh của fdupes nâng cao , nhưng cũng bao gồm:

  • một loạt các tùy chọn dòng lệnh mới - bao gồm --linkhardhoặc -Lviết tắt
  • hỗ trợ riêng cho tất cả các nền tảng HĐH chính
  • tốc độ trung bình nhanh hơn 7 lần so với fdupes

Đối với câu hỏi của bạn, bạn chỉ có thể thực hiện $ jdupes -L /path/to/your/files.

Bạn có thể muốn sao chép và xây dựng nguồn mới nhất từ repo GitHub của nó vì dự án vẫn đang được phát triển tích cực. Các tệp nhị phân của Windows cũng được cung cấp tại đây. Các tệp nhị phân đóng gói có sẵn trong một số bản phân phối Linux / BSD - thực sự lần đầu tiên tôi tìm thấy nó thông qua $ apt search.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.