2012-06-18 15 views
9

Sử dụng Gnome trong Linux Mint 12, tôi đã sao chép một thư mục khoảng 9,7 GB (chứa cây phức tạp của thư mục con) từ ổ đĩa flash NTFS sang ổ đĩa flash NTFS khác. Theo Gnome, số lượng tệp phù hợp, nhưng theo du (và các chương trình khác) số byte không khớp. (Tôi đã gặp vấn đề khi sao chép các thư mục trong các bản phân phối Linux khác và Windows XP.)So sánh 2 thư mục và tìm tập tin với số đếm Byte khác nhau

Tôi chỉ muốn biết tệp nào không có số byte phù hợp. (Tôi không muốn so sánh nội dung của mỗi tập tin, vì điều đó sẽ mất quá nhiều thời gian.) Cách tốt nhất, dễ nhất và nhanh nhất để tìm các tập tin có số byte không khớp là gì?

+0

giải pháp One-liner tìm thấy cho có liên quan câu hỏi Unix StackExchange: http://unix.stackexchange.com/q/62140 – tanius

Trả lời

3

Giả sử bạn cần phải so sánh dir1 và dir 2, đây là các lệnh điều khiển:

cd dir1 
find . -type f|sort|xargs ls -l| awk '{print $5,$8}' > ~/dir1.txt 
cd dir2 
find . -type f|sort|xargs ls -l| awk '{print $5,$8}' > ~/dir2.txt 
diff ~/dir1.txt ~/dir2.txt 

Bạn có thể cần phải chỉnh sửa các thông số awk để làm cho nó in chiều dài tập tin và đường dẫn đúng cách.

6

Bạn có kiểm tra xem cả hai phân vùng có cùng thuộc tính không? (kích thước, kích thước, không gian dành riêng cho việc xóa hoặc các khối xấu, v.v.)

Trong trường hợp cụ thể của bạn, tôi sẽ giới thiệu rsync với tùy chọn -n (hoặc --dry-run). Nó sẽ cho bạn biết các tệp nào khác nhau. Đó là:

$ rsync -I -n /source/ /target/ 

Tùy chọn -I là bỏ qua lần. Bạn có thể sử dụng cùng một lệnh để làm cho cả hai thư mục tương đương nhau (dấu thời gian, quyền, vv).

Kiểm tra hướng dẫn sử dụng rsync hoặc thử tùy chọn --help để nhận thêm tùy chọn và ví dụ về cách sử dụng. Nó rất mạnh mẽ.

10

Tôi sẽ điều chỉnh câu trả lời bằng @ user1464130 vì nó gặp sự cố khi xử lý dấu cách trong tên tệp.

cd dir1 
find . -type f -printf "%p %s\n" | sort > ~/dir1.txt 
cd dir2 
find . -type f -printf "%p %s\n" | sort > ~/dir2.txt 
diff ~/dir1.txt ~/dir2.txt 

Nếu bạn muốn khởi chạy một lệnh trên mỗi tập tin và sử dụng kết quả trong báo cáo, bạn có thể sử dụng cấu trúc while Bash. Ví dụ này sử dụng md5sum để tính tổng kiểm tra cho mỗi tệp.

find . -maxdepth 1 -type f -printf "%p %s\n" | while read path size; do echo "$path - $(md5sum $path | tr -s " " | cut -f 1 -d " ") - $size" ; done 

Mỗi $() được thực hiện riêng và cho phép chúng tôi tính toán tổng kiểm tra cho từng tệp. Việc sử dụng tr sẽ nén mọi khoảng trắng liên tiếp vào một khoảng trắng và cut trích xuất từ ​​ở vị trí thứ n, ở vị trí đầu tiên. Nếu chúng ta không làm điều đó, chúng ta sẽ lấy tên của tập tin hai lần vì md5sum trả lại nó trên stdout.

Dưới đây là ví dụ mà không sử dụng so sánh (no diff). Lưu ý rằng tôi đã sử dụng dấu gạch ngang - để nhấn mạnh ba dữ liệu chúng tôi xuất ra về mỗi tệp nhưng có thể đó là vấn đề nếu bạn muốn cấp dữ liệu đó cho một chương trình khác.

$ find . -maxdepth 1 -name "*.c" -type f -printf "%p %s\n" | while read path size; do echo "$path - $(md5sum $path | tr -s " " | cut -f 1 -d " ") - $size" ; done 
./thread.c - 5f2b7b12c7cd12fcb9e9796078e5d15b - 584 
./utils.c - d61bc1dbc72768e622a04f03e3b8f7a2 - 3413 
+0

Làm thế nào khó khăn nó sẽ được điều chỉnh kịch bản này để in một checksum cho mỗi tập tin trong danh sách ? – mydoghasworms

+0

Tôi đã chỉnh sửa câu trả lời của mình để cung cấp giải pháp. Tôi vừa thêm vào tổng kiểm tra mà không làm việc khác. Bạn có muốn phân biệt trên tổng kiểm tra không?Nếu đúng như vậy thì bạn không cần số byte và nó khác một chút so với câu hỏi OP. Hơn nữa kiểm tra là tốt hơn nếu chúng ta muốn chắc chắn rằng cả hai tập tin đều giống nhau hay không. Chúng tôi thậm chí có thể thêm thời gian sửa đổi tệp – lkuty

+0

Gnarly. Cảm ơn nhiều. – mydoghasworms