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
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