md5sum của các tệp trong hai thư mục


1

Tôi đang cố gắng so sánh tất cả các tệp trong hai thư mục thông qua md5sum trong một lệnh. Một số như sau (bash) trong Debian:

$ cd ~/FOLDER1
$ md5sum ~/FOLDER2/* | md5sum -c -

Ý tưởng là đầu ra của các giá trị băm từ md5sum đầu tiên sẽ được chuyển sang cái thứ hai và được sử dụng làm tệp đầu vào. Tuy nhiên, thử nghiệm này cho thấy rằng nó chỉ so sánh từng tệp trong FOLDER2 với chính nó và trả về "OK" cho mỗi tệp. Tôi nghĩ lý do điều này không hoạt động là vì đầu ra tên tệp từ md5sum đầu tiên bao gồm đường dẫn đầy đủ. Tôi đã nhìn md5deepnhưng không tìm thấy gì để giúp tôi ở đó. Tôi biết rằng có thể thực hiện md5sum cho một thư mục, ghi kết quả ra một tệp và sau đó sử dụng tệp đó làm đầu vào cho md5sum thứ hai. Tôi muốn làm tất cả trong một dòng qua một đường ống, thay vì sử dụng hai lệnh và viết ra một tệp.

Chỉnh sửa: Câu trả lời được chấp nhận ở đây (sử dụng diff) có thể làm những gì tôi muốn, nhưng tôi không biết nếu diff(chính xác) so sánh các tệp nhị phân.

Chỉnh sửa: Nhận đầu ra mà tôi muốn bằng md5sum (hiển thị tên tệp và "OK"), tôi đã dùng đến cách viết một tệp bó. Thực hiện với diffFolders.sh ~/FOLDER1 ~/FOLDER2.

#!/bin/bash
HERE=$PWD
cd "$1"
md5sum * > /tmp/md5sum.cmp
cd "$2"
md5sum -c /tmp/md5sum.cmp
cd $HERE

Kịch bản này sẽ chỉ so sánh các tập tin có trong ~/FOLDER. Nếu ~/FOLDER2có các tệp bổ sung, chúng sẽ không được so sánh và không có đầu ra nào cho biết chúng thậm chí còn tồn tại.

Câu trả lời:


2

Bạn có thể sử dụng thay thế quá trình để chuyển đầu ra của 2 md5sum sang diff. Diff trong trường hợp này sẽ ổn vì đầu ra md5 là văn bản thuần túy. Cái gì đó như:

diff <(md5 ~/FOLDER1/* | awk '{print $4}') <(md5 ~/FOLDER2/* | awk '{print $4}')

Xin lỗi, tôi không có Debian ở đây và không thể kiểm tra cái này trên đó. Ở trên đã được thử nghiệm trên OS X có md5, có thể hơi khác về sản lượng. Trên OS X, cột thứ 4 của md5 là tổng md5 thực tế, đó là lý do tại sao tôi chỉ lấy các cột này.

Thay vì awk, bạn cũng có thể sử dụng cut, nhưng bạn có thể cần thay đổi dấu phân cách để lấy cột thứ 4 (những cột này không được phân tách bằng tab).


Cảm ơn. Điều này hoạt động khá tốt, miễn là bạn biết cách diễn giải đầu ra của nó diff, điều này khiến tôi mất một lúc :) Trong Debian, lệnh là md5sumvà hàm băm thực tế nằm trong cột 1.
SabreWolfy

0

Loại dài nhưng trả về tên tệp và OK nếu chúng khớp. Thay vì sử dụng '-c', nó chỉ so sánh đầu ra hai chuỗi từ việc chạy md5sum trên tệp trong mỗi thư mục.

for f in *; do [[ -f $f ]] && if [ $(md5sum "$f" | cut -d" " -f1) == $(md5sum dir2/"$f" | cut -d" " -f1) ]; then echo "$f" "OK"; else echo "$f" "MODIFIED"; fi; done

0

Từ tệp .bashrc của tôi.
những thứ rất cũ , nó có thể được viết bằng nhiều mã sắp xếp. Tôi không bao giờ có xung quanh để viết lại nó. (giống như mọi thứ khác có nghĩa là để sửa lỗi tạm thời, được sử dụng mãi mãi) Tôi đang đăng đoạn mã đáng xấu hổ này, hy vọng ai đó có thể làm điều đó tốt hơn và đăng kết quả :-)

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

  • Recrusive dir ngang
  • md5sum kiểm tra tính độc đáo / khác biệt
  • Liệt kê các tệp được cập nhật trong đường dẫn đầy đủ

Mã nói lên tất cả. arg1 là dir cũ, arg2 là dir mới.

function find-updated-files-between-old-new(){
 [ ! -d "$1" ] || [ ! -d "$2" ] && echo "*** Error: The directory is not found." > /dev/stderr && return 1;
( ( cat <(cd "$1";find . -type f -printf "+%p\n") <(cd "$2";find . -type f -printf "-%p\n")
 )|sort -k1.2|tee 1>/dev/null >(uniq -us1|awk -v B="$2" 'BEGIN{sub("/$",""B)}/^-/{print B substr($0,3);
 }') >(uniq -ds1|awk -vA="$1" -vB="$2" 'BEGIN{B=g(B);A=g(A)}{
 C=substr($0,3);if(f(A)!=f(B))print B C;}function g(y){sub("/$","",y);return y}
 function f(y,z,e){e="md5sum \""y""C"\"";e|getline z;close(e);return substr(z,1,32)}' )
 ) | cat
}

Như tên hàm

function find-files-name-collision-between-dir1dir2(){
 [ ! -d "$1" ] || [ ! -d "$2" ] && echo "*** Error: The directory is not found." > /dev/stderr && return 1;
( cat <(cd "$1";find . -type f -printf "+%p\n") <(cd "$2";find . -type f -printf "-%p\n") )|sort -k 1.2 | uniq -d -s 1
}

Chỉ để hoàn thiện

function mv-mergedir1todir2(){
 [ ! -d "$1" ] || [ ! -d "$2" ] && echo "*** Error: The directory is not found." && return 1;
 ( cd "$1" ; tar cf - . ) | (cd "$2" ; tar --keep-old-files xvf - )
 echo -e "Done. Duplicate filnames are not replaced. \n#Use \n# ( cd \"$1\" ; tar cf - . ) | (cd \"$2\" ; tar --overwrite xvf - ) \n#if you do not like that. "
}

Đoạn mã khủng khiếp này cần được xóa khỏi bashrc của tôi, tuy nhiên nó đã xuất hiện từ lâu ...


Nó có hoạt động không? Đây có phải là một câu trả lời cho câu hỏi, hoặc bạn muốn phản hồi về mã?
SabreWolfy
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.