web-dev-qa-db-ja.com

2つのフォルダ内のファイルのmd5sum

1つのコマンドでmd5sumを使用して、2つのフォルダー内のすべてのファイルを比較しようとしています。 Debianでは次のようなもの(bash):

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

最初のmd5sumからのハッシュの出力が2番目のハッシュに渡され、入力ファイルとして使用されるという考え方です。ただし、これをテストすると、FOLDER2の各ファイルをそれ自体と比較し、各ファイルに対して「OK」を返すことがわかります。これが機能しない理由は、最初のmd5sumから出力されるファイル名にフルパスが含まれているためだと思います。 md5deepを見ましたが、そこで役立つものは何も見つかりませんでした。 1つのフォルダーに対してmd5sumを実行し、結果をファイルに書き込んでから、そのファイルを2番目のmd5sumの入力として使用することが可能であることを私は知っています。 2つのコマンドを使用してファイルを書き出すのではなく、パイプを介してすべてを1行で実行したかったのです。

編集:受け入れられた答え ここdiffを使用)は私が望むことをするかもしれませんが、diffが(正しく)バイナリファイルを比較するかどうかはわかりません。

編集:md5sum(ファイル名と「OK」を表示)を使用して必要な出力を取得します。バッチファイルを作成することにしました。 diffFolders.sh ~/FOLDER1 ~/FOLDER2で実行します。

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

このスクリプトは、~/FOLDERに存在するファイルのみを比較します。 ~/FOLDER2に追加のファイルがある場合、これらは比較されず、それらが存在することを示す出力もありません。

1
SabreWolfy

プロセス置換 を使用して、2つのmd5sumの出力をdiffに渡すことができます。 md5の出力はプレーンテキストであるため、この場合の差分は問題ありません。何かのようなもの:

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

申し訳ありませんが、私はここにDebianを持っておらず、これをテストすることはできません。上記は、出力の点でわずかに異なる可能性があるmd5を持つOSXでテストされています。 OS Xでは、md5の4番目の列が実際のmd5の合計であるため、これらの列だけを使用しています。

Awkの代わりにcutを使用することもできますが、4番目の列を取得するために区切り文字を変更する必要がある場合があります(これらはタブ区切りではありません)。

2
lupincho

ちょっと長いですが、ファイル名を返し、一致すればOKです。 '-c'を使用する代わりに、各フォルダー内のファイルでmd5sumを実行して出力された2つの文字列を比較するだけです。

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
a_lurker

私の.bashrcファイルから。
非常に古いもの、多くのソーターコードで書くことができるはずです。私はそれを書き直すことは決してありませんでした。 (一時的な修正を目的とした他のすべてのように、永久に使用されます)私はこの恥ずべきコードを投稿しています、うまくいけば誰かがそれをより良くして結果を投稿することができます:-)

特徴 :

  • 再帰的な方向横断
  • md5sumの一意性/相違性のチェック
  • 更新されたファイルをフルパスで一覧表示します

コードはそれをすべて言います。 arg1は古いディレクトリ、arg2は新しいディレクトリです。

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
}

関数名が示すように

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
}

完全を期すために

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. "
}

このひどいコードは私のbashrcから削除する必要がありますが、それは長い間存在していました...

0
GreenFox