サーバーとクライアントシステム間の2つの大きなディレクトリを比較しています。両方のディレクトリが同じであることを確認するために、以下のコマンドに似たコマンドを実行します。
find /path/to/dir/ -type f -print0 | sort -z | xargs -0 sha1sum | sha1sum
ただし、異なる場合は、親ディレクトリの下のすべてのディレクトリとファイルに対して同様のコマンドを実行するには、1つのレベルを下回る必要があります。 「forループ」を書くことができますが、ディレクトリ全体のチェックサムを計算するより効率的な方法があるかどうかを知りたいです。これにより、サーバー/クライアントシステム間の比較が簡単になります。
注:フォルダ内の個々のチェックサムは、そのディレクトリに含まれるファイルのチェックサムを反映します。
私は次のことを想像しています。
$ checksumForDir /path/to/dir/*
/path/to/dir/a/ 18fad1ea8141fd1
/path/to/dir/b/ 17fad1ea8141fd1
/path/to/dir/c/ 94fad1ea8141fd1
これまでは、親ディレクトリからチェックサムリストを取得する1行のコードを書きましたが、ディレクトリ名をマージすることはできません。
$ ls -d1 /parentDir/*/ | xargs -I {} sh -c 'find "{}" -type f -print0 | sort -z | xargs -0 sha1sum | sha1sum'
29ce013658a00862338ac848c2f90b2e18853a01 -
8f208342084950297b1376f669a9a3c93beca790 -
ae7f589d40f9222d1b06094d0c2f68649fb6cf08 -
答え1
私が見つけた最良の方法は、次のコマンドを使用することです。
$ ls -d1 /path/to/dir/*/ | xargs -I {} sh -c 'echo -n "{} " && find "{}" -type f -print0 | sort -z | xargs -0 sha1sum | sha1sum'
/path/to/dir/a/ 18fad1ea8141fd1 -
/path/to/dir/b/ 17fad1ea8141fd1 -
/path/to/dir/c/ 94fad1ea8141fd1 -
少し複雑に見えますが、まだ良い方法が見つかりませんでした。