it-swarm-vi.com

Có một cách dễ dàng để thay thế các tập tin trùng lặp với các liên kết cứng?

Tôi đang tìm kiếm một cách dễ dàng (một lệnh hoặc một loạt các lệnh, có thể liên quan đến find) để tìm các tệp trùng lặp trong hai thư mục và thay thế các tệp trong một thư mục bằng các liên kết cứng của các tệp trong thư mục khác.

Đây là tình huống: Đây là một máy chủ tệp mà nhiều người lưu trữ tệp âm thanh trên, mỗi người dùng có thư mục riêng. Đôi khi nhiều người có bản sao của các tệp âm thanh chính xác. Ngay bây giờ, đây là những bản sao. Tôi muốn làm cho nó trở thành liên kết cứng, để tiết kiệm dung lượng ổ cứng.

146
Josh

Có một tập lệnh Perl tại http://cpansearch.Perl.org/src/ANDK/Perl-Repousing-APC-2.002/eg/trimtrees.pl thực hiện chính xác những gì bạn muốn:

Di chuyển tất cả các thư mục có tên trên dòng lệnh, tính toán tổng MD5 và tìm các tệp có MD5 giống hệt nhau. NẾU chúng bằng nhau, hãy so sánh thực sự nếu chúng thực sự bằng nhau, thay thế tệp thứ hai trong hai tệp bằng một liên kết cứng thành tệp đầu tiên.

42
fschmitt

rdfind thực hiện chính xác những gì bạn yêu cầu (và theo thứ tự johny why liệt kê). Làm cho nó có thể xóa các bản sao, thay thế chúng bằng các liên kết mềm hoặc cứng. Kết hợp với symlinks bạn cũng có thể tạo liên kết tượng trưng tuyệt đối hoặc tương đối. Bạn thậm chí có thể chọn thuật toán tổng kiểm tra (md5 hoặc sha1).

Vì nó được biên dịch, nó nhanh hơn hầu hết các giải pháp theo kịch bản: time trên thư mục 15 GiB với 2600 tệp trên Mac Mini của tôi từ năm 2009 trả về

9.99s user 3.61s system 66% cpu 20.543 total

(sử dụng md5).

Có sẵn trong hầu hết các trình xử lý gói (ví dụ: MacPorts cho Mac OS X).

98
d-b

Sử dụng công cụ fdupes:

fdupes -r /path/to/folder cung cấp cho bạn một danh sách các bản sao trong thư mục (-r làm cho nó đệ quy). Đầu ra trông như thế này:


tên tệp1
[.__.] Tên tệp2

tên tệp3
[.__.] Tên tệp4
[.__.] Tên tệp5


với filename1 và filename2 giống hệt nhau và filename3, filename4 và filename5 cũng giống hệt nhau.

51
tante

Tôi sử dụng hardlink từ http://jak-linux.org/projects/hardlink/

24
waltinator

Đây là một trong những chức năng được cung cấp bởi "fslint" - http://en.flossmanuals.net/FSlint/Intributiontion

Nhấp vào nút "Hợp nhất":

Screenshot

18
LJ Wobker

Vì mục tiêu chính của bạn là tiết kiệm dung lượng ổ đĩa, nên có một giải pháp khác: khử trùng lặp (và có thể nén) ở cấp hệ thống tệp. So với giải pháp liên kết cứng, nó không có vấn đề vô tình ảnh hưởng đến các tệp được liên kết khác.

ZFS đã khấu trừ (cấp khối, không phải cấp tệp) kể từ phiên bản nhóm 23 và nén từ lâu. Nếu bạn đang sử dụng linux, bạn có thể thử zfs-Fuse hoặc nếu bạn sử dụng BSD, nó được hỗ trợ nguyên bản.

14
Wei-Yin

Trên Linux hiện đại ngày nay có https://github.com/g2p/bedup mà sao chép lại trên hệ thống tệp btrfs, nhưng 1) mà không cần nhiều tệp quét, 2) có thể dễ dàng phân kỳ một lần nữa sau đó.

7
Matthew Bloch
aptitude show hardlink

Mô tả: Hardlink nhiều bản sao của cùng một tệp Hardlink là một công cụ phát hiện nhiều bản sao của cùng một tệp và thay thế chúng bằng các liên kết cứng.

Ý tưởng đã được lấy từ http://code.google.com.vn/p/hardlinkpy/ , nhưng mã đã được viết từ đầu và được cấp phép theo MIT giấy phép. Trang chủ: http://jak-linux.org/projects/hardlink/

6
Julien Palard

Để tìm các tệp trùng lặp, bạn có thể sử dụng duff.

Duff là một tiện ích dòng lệnh Unix để nhanh chóng tìm thấy các bản sao trong một tập hợp các tệp nhất định.

Đơn giản chỉ cần chạy:

duff -r target-folder

Để tự động tạo liên kết cứng đến các tệp đó, bạn sẽ cần phân tích đầu ra của duff với bash hoặc một số tập lệnh khác ngôn ngữ.

6
Stefan

Tôi đã sử dụng nhiều công cụ liên kết cứng cho Linux được đề cập ở đây. Tôi cũng bị mắc kẹt với ext4 fs, trên Ubuntu và đã sử dụng cp -l - s cho liên kết cứng/mềm. Nhưng gần đây nhận thấy bản sao nhẹ trong trang man cp, có nghĩa là sẽ tiết kiệm dung lượng đĩa dự phòng cho đến khi một bên được sửa đổi:

   --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 đã được đề cập trong một bình luận nhưng xứng đáng với câu trả lời của riêng mình, vì nó có thể có sẵn trong hầu hết các bản phân phối và chạy khá nhanh (nó chỉ giải phóng 2,7GB phân vùng 158 GB (ổ SSD) đầy đủ 98% trong khoảng một phút) :

jdupes -rL /foo/bar
4

Dường như với tôi rằng việc kiểm tra tên tệp trước tiên có thể tăng tốc mọi thứ. Nếu hai tệp thiếu cùng tên tệp thì trong nhiều trường hợp tôi sẽ không coi chúng là trùng lặp. Có vẻ như phương pháp nhanh nhất sẽ là so sánh, theo thứ tự:

  • tên tệp
  • kích thước
  • tổng kiểm tra md5
  • nội dung byte

Có phương pháp nào làm việc này không? Nhìn vào duff, fdupes, rmlint, fslint, v.v.

Phương pháp sau đây được bình chọn hàng đầu trên commandlinefu.com : Tìm tệp trùng lặp (dựa trên kích thước trước, sau đó băm MD5)

So sánh tên tệp có thể được thêm vào như bước đầu tiên, kích thước như bước thứ hai không?

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

Vì tôi không phải là fan hâm mộ của Perl, đây là phiên bản 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

Điều này tìm thấy tất cả các tệp có cùng một tổng kiểm tra (cho dù chúng lớn, nhỏ hoặc đã có liên kết cứng) và liên kết chúng với nhau.

Điều này có thể được tối ưu hóa rất nhiều cho các lần chạy lặp lại với các cờ tìm kiếm bổ sung (ví dụ: kích thước) và bộ đệm tệp (vì vậy bạn không phải làm lại tổng kiểm tra mỗi lần). Nếu bất cứ ai quan tâm đến phiên bản thông minh hơn, dài hơn, tôi có thể đăng nó.

LƯU Ý : Như đã đề cập trước đây, các liên kết cứng hoạt động miễn là các tệp không bao giờ cần sửa đổi hoặc được di chuyển qua các hệ thống tệp.

3
seren

Nếu bạn muốn thay thế các bản sao bằng Hard Links trên mac hoặc bất kỳ hệ thống dựa trên UNIX nào, bạn có thể thử SmartDupe http://sourceforge.net/projects/smartdupe/ đang phát triển nó

1
islam

Tôi đã tạo một kịch bản Perl làm một cái gì đó tương tự như những gì bạn đang nói về:

http://Pastebin.com/U7mFHZU7

Về cơ bản, nó chỉ đi qua một thư mục, tính toán SHA1sum của các tệp trong đó, băm nó và liên kết các kết quả khớp với nhau. Nó có ích trong nhiều, nhiều dịp.

1
amphetamachine

Ứng dụng FSLint ( http://www.pixelbeat.org/fslint/ ) có thể tìm thấy tất cả các tệp bằng nhau trong bất kỳ thư mục nào (theo nội dung) và tạo liên kết cứng. Hãy thử một lần!

Jorge Sampaio

1
Jorge H B Sampaio Jr

Liên kết cứng có thể không phải là ý tưởng tốt nhất; nếu một người dùng thay đổi tập tin, nó sẽ ảnh hưởng đến cả hai. Tuy nhiên, xóa một liên kết cứng không xóa cả hai tập tin. Thêm vào đó, tôi không hoàn toàn chắc chắn nếu Liên kết cứng chiếm cùng một dung lượng (trên đĩa cứng chứ không phải HĐH) như nhiều bản sao của cùng một tệp; theo Windows (với Link Shell Extension), họ làm. Cấp, đó là Windows, không phải Unix ...

Giải pháp của tôi là tạo một tệp "chung" trong một thư mục ẩn và thay thế các bản sao thực tế bằng các liên kết tượng trưng ... sau đó, các liên kết tượng trưng sẽ được nhúng bằng siêu dữ liệu hoặc các luồng tệp thay thế chỉ ghi lại hai "tệp" khác nhau, như nếu một người muốn thay đổi tên tệp hoặc thêm nghệ thuật album tùy chỉnh hoặc một cái gì đó tương tự; nó thậm chí có thể hữu ích bên ngoài các ứng dụng cơ sở dữ liệu, như có nhiều phiên bản của cùng một trò chơi hoặc phần mềm được cài đặt và kiểm tra chúng một cách độc lập với những khác biệt nhỏ nhất.

0
Amaroq Starwind

Nếu bạn sẽ làm liên kết cứng, hãy chú ý đến quyền trên tệp đó. Lưu ý, chủ sở hữu, nhóm, chế độ, thuộc tính mở rộng, thời gian và ACL (nếu bạn sử dụng) được lưu trữ trong INODE. Chỉ tên tệp là khác nhau vì điều này được lưu trữ trong cấu trúc thư mục và các điểm khác cho thuộc tính INODE. Nguyên nhân này, tất cả các tên tệp được liên kết với cùng một nút, có cùng quyền truy cập. Bạn nên ngăn chặn sửa đổi tập tin đó, bởi vì bất kỳ người dùng nào cũng có thể làm hỏng tập tin khác. Nó đơn giản. Nó là đủ, bất kỳ người dùng đặt tập tin khác trong cùng một tên. Số inode sau đó được lưu và nội dung tệp gốc bị hủy (thay thế) cho tất cả các tên liên kết cứng.

Cách tốt hơn là sự trùng lặp trên lớp hệ thống tập tin. Bạn có thể sử dụng BTRFS (rất phổ biến thời gian qua), OCFS hoặc như thế này. Nhìn vào trang: https://en.wikipedia.org/wiki/Comparison_of_file_systems , đặc biệt tại bảng Tính năng và sao chép dữ liệu cột. Bạn có thể nhấp vào nó và sắp xếp :)

Đặc biệt nhìn vào hệ thống tập tin ZFS. Cái này có sẵn dưới dạng Fuse, nhưng theo cách này thì nó rất chậm. Nếu bạn muốn hỗ trợ riêng, hãy xem trang http://zfsonlinux.org/ . Sau đó, bạn phải vá kernel và cài đặt công cụ zfs tiếp theo để quản lý. Tôi không hiểu, tại sao linux không hỗ trợ như trình điều khiển, đó là cách cho nhiều hệ điều hành/hạt nhân khác.

Hệ thống tệp hỗ trợ sao chép bằng 2 cách, sao chép tệp hoặc chặn. ZFS hỗ trợ khối. Điều này có nghĩa, cùng một nội dung lặp lại trong cùng một tệp có thể được lặp lại. Một cách khác là thời gian khi dữ liệu bị trùng lặp, điều này có thể là trực tuyến (zfs) hoặc ngoại tuyến (btrfs).

Lưu ý, sự trùng lặp tiêu tốn RAM. Đây là lý do tại sao việc ghi tệp vào khối lượng ZFS được gắn với Fuse, gây ra hiệu suất chậm đáng kể. Điều này được mô tả trong tài liệu. Nhưng bạn có thể trực tuyến thiết lập bật/tắt sự trùng lặp về âm lượng. Nếu bạn thấy bất kỳ dữ liệu nào cần được sao chép, bạn chỉ cần đặt sao chép vào, viết lại một số tệp thành bất kỳ tạm thời và cuối cùng thay thế. sau này, bạn có thể tắt sự trùng lặp và khôi phục hiệu suất đầy đủ. Tất nhiên, bạn có thể thêm vào lưu trữ bất kỳ đĩa bộ nhớ cache. Đây có thể là đĩa quay rất nhanh hoặc đĩa SSD. Tất nhiên đây có thể là đĩa rất nhỏ. Trong công việc thực tế, đây là sự thay thế cho RAM :)

Trong linux, bạn nên chăm sóc ZFS vì không phải tất cả đều hoạt động như bình thường, đặc biệt khi bạn quản lý hệ thống tập tin, tạo ảnh chụp nhanh, v.v. nhưng nếu bạn cấu hình và không thay đổi nó, tất cả đều hoạt động bình thường. Theo cách khác, bạn nên thay đổi linux thành opensolaris, nó thực sự hỗ trợ ZFS :) Điều rất hay với ZFS là, điều này hoạt động cả dưới dạng hệ thống tập tin và trình quản lý volum tương tự LVM. Bạn không cần nó khi bạn sử dụng ZFS. Xem tài liệu nếu bạn muốn biết thêm.

Lưu ý sự khác biệt giữa ZFS và BTRFS. ZFS cũ hơn và trưởng thành hơn, không may chỉ dưới Solaris và OpenSolaris (không may bị Oracle bóp nghẹt). BTRFS trẻ hơn, nhưng thời gian qua được hỗ trợ rất tốt. Tôi khuyên bạn nên hạt nhân tươi. ZFS có sự trùng lặp trực tuyến, điều đó gây ra sự chậm viết, bởi vì tất cả được tính trực tuyến. BTRFS hỗ trợ khấu trừ ngoại tuyến. Sau đó, điều này sẽ tiết kiệm hiệu suất, nhưng khi Host không có gì để làm, bạn chạy công cụ định kỳ để thực hiện sao chép. Và BTRFS được tạo ra theo linux. Có lẽ điều này tốt hơn FS cho bạn :)

0
Znik

Cách dễ nhất là sử dụng chương trình dupeGuru đặc biệt

dupeGuru Preferences Screenshot

như tài liệ nói

Tùy chọn xóa

Các tùy chọn này ảnh hưởng đến cách xóa trùng lặp diễn ra. Hầu hết thời gian, bạn không cần phải kích hoạt bất kỳ ứng dụng nào trong số đó.

Liên kết các tập tin bị xóa:

Các tập tin bị xóa được thay thế bằng một liên kết đến tập tin tham khảo. Bạn có thể lựa chọn thay thế nó bằng symlink hoặc hardlink. ... một liên kết tượng trưng là một lối tắt đến đường dẫn tập tin. Nếu tệp gốc bị xóa hoặc di chuyển, liên kết bị hỏng. Một liên kết cứng là một liên kết đến chính tập tin. Liên kết đó tốt như một tập tin thực sự của người Viking. Chỉ khi tất cả các liên kết cứng đến một tệp bị xóa thì chính tệp đó sẽ bị xóa.

Trên OSX và Linux, tính năng này được hỗ trợ đầy đủ, nhưng trong Windows, nó có một chút phức tạp. Windows XP không hỗ trợ nó, nhưng Vista và hỗ trợ nó. Tuy nhiên, để tính năng hoạt động, dupeGuru phải chạy với các đặc quyền quản trị.