如何计算目录中每个文件夹的单个校验和?

如何计算目录中每个文件夹的单个校验和?

我正在比较服务器和客户端计算机之间的两个大目录。我运行类似于下面的命令来确定这两个目录是否相同。

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

到目前为止,我编写了一个单行代码来从父目录获取校验和列表......但无法合并目录的名称。

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

看起来有点复杂,但目前还没有找到更好的方法。

相关内容