当然必须有办法轻松做到这一点!
我已经尝试了Linux等命令行应用程序sha1sum,md5sum但它们似乎只能计算单个文件的哈希值并输出一个哈希值列表,每个文件一个.
我需要为文件夹的整个内容(而不仅仅是文件名)生成单个哈希.
我想做点什么
sha1sum /folder/of/stuff > singlehashvalue
Run Code Online (Sandbox Code Playgroud)
编辑:澄清一下,我的文件位于目录树的多个级别,它们并非都位于同一个根文件夹中.
Vat*_*ine 99
一种可能的方法是:
sha1sum path/to/folder/* | sha1sum
如果有一个完整的目录树,那么最好使用find和xargs.一个可能的命令是
find path/to/folder -type f -print0 | sort -z | xargs -0 sha1sum | sha1sum
最后,如果您还需要考虑权限和空目录:
(find path/to/folder -type f -print0 | sort -z | xargs -0 sha1sum;
find path/to/folder \( -type f -o -type d \) -print0 | sort -z | \
xargs -0 stat -c '%n %a') \
| sha1sum
Run Code Online (Sandbox Code Playgroud)
参数stat将导致它打印文件的名称,后跟其八进制权限.这两个发现将一个接一个地运行,导致磁盘IO的数量增加一倍,第一个查找所有文件名并校验内容,第二个查找所有文件和目录名,打印名称和模式.然后将"文件名和校验和"列表,后跟"具有权限的名称和目录"进行校验和,以获得较小的校验和.
Dav*_*itt 22
将目录提交到git,使用commit hash.请参阅metastore以获取控制权限的方法.
使用文件系统入侵检测工具,如助手.
哈希目录的tar球:
tar cvf - /path/to/folder | sha1sum
自己编写代码,比如vatine的oneliner:
find /path/to/folder -type f -print0 | sort -z | xargs -0 sha1sum | sha1sum
Wan*_*ang 21
到目前为止,最快的方法仍然是使用 tar。通过几个附加参数,我们还可以消除元数据造成的差异。
要使用 GNU tar 对目录进行哈希处理,需要确保在 tar 期间对路径进行排序,否则它总是不同的。
tar -C <root-dir> -cf - --sort=name <dir> | sha256sum
Run Code Online (Sandbox Code Playgroud)
如果您不关心访问时间或修改时间,也可以使用类似的方法--mtime='UTC 2019-01-01' 来确保所有时间戳都是相同的。
通常我们需要添加--group=0 --owner=0 --numeric-owner统一所有者元数据。
使用--exclude=PATTERN
强烈建议您始终比较权限。
如果您确实不想比较权限,请使用:
--mode=777
Run Code Online (Sandbox Code Playgroud)
这会将所有文件权限授予 777。
例子:
$ echo a > test1/a.txt
$ echo b > test1/b.txt
$ tar -C ./ -cf - --sort=name test1 | sha256sum
e159ca984835cf4e1c9c7e939b7069d39b2fd2aa90460877f68f624458b1c95c -
$ tar -C ./ -cf - --sort=name --mode=777 test1 | sha256sum
ef84fe411fb49bcf7967715b7854075004f1c7a7e4a57d2f3742afa4a54c40de -
$ chmod 444 test1/a.txt
$ tar -C ./ -cf - --sort=name --mode=777 test1 | sha256sum
ef84fe411fb49bcf7967715b7854075004f1c7a7e4a57d2f3742afa4a54c40de -
$ tar -C ./ -cf - --sort=name test1 | sha256sum
9b91430d954abb8a361b01de30f0995fb94a511c8fe1f7177ddcd475c85c65ff -
Run Code Online (Sandbox Code Playgroud)
众所周知,有些 tar 没有--sort,请确保您有 GNU tar。
S.L*_*ott 11
你可以做 tar -c /path/to/folder | sha1sum
如果这是一个 git 存储库并且您想忽略 中的任何文件.gitignore,您可能需要使用以下命令:
git ls-files <your_directory> | xargs sha256sum | cut -d" " -f1 | sha256sum | cut -d" " -f1
Run Code Online (Sandbox Code Playgroud)
这对我来说效果很好。
如果您只是想检查文件夹中的某些内容是否发生了变化,我建议您这样做:
ls -alR --full-time /folder/of/stuff | sha1sum
Run Code Online (Sandbox Code Playgroud)
它只会给你一个ls输出的哈希值,它包含文件夹,子文件夹,它们的文件,它们的时间戳,大小和权限.几乎所有你需要确定的东西是否有变化.
请注意,此命令不会为每个文件生成哈希值,但这就是为什么它应该比使用find更快.
这就是我的想法,任何花一些时间在这方面工作的人实际上都会遇到其他问题和角落案例。
这里有一个工具,非常节省内存,可以解决大多数情况,可能有点粗糙,但非常有帮助。
dtreetrawl。Run Code Online (Sandbox Code Playgroud)Usage: dtreetrawl [OPTION...] "/trawl/me" [path2,...] Help Options: -h, --help Show help options Application Options: -t, --terse Produce a terse output; parsable. -j, --json Output as JSON -d, --delim=: Character or string delimiter/separator for terse output(default ':') -l, --max-level=N Do not traverse tree beyond N level(s) --hash Enable hashing(default is MD5). -c, --checksum=md5 Valid hashing algorithms: md5, sha1, sha256, sha512. -R, --only-root-hash Output only the root hash. Blank line if --hash is not set -N, --no-name-hash Exclude path name while calculating the root checksum -F, --no-content-hash Do not hash the contents of the file -s, --hash-symlink Include symbolic links' referent name while calculating the root checksum -e, --hash-dirent Include hash of directory entries while calculating root checksum
人类友好输出的片段:
Run Code Online (Sandbox Code Playgroud)... ... //clipped ... /home/lab/linux-4.14-rc8/CREDITS Base name : CREDITS Level : 1 Type : regular file Referent name : File size : 98443 bytes I-node number : 290850 No. directory entries : 0 Permission (octal) : 0644 Link count : 1 Ownership : UID=0, GID=0 Preferred I/O block size : 4096 bytes Blocks allocated : 200 Last status change : Tue, 21 Nov 17 21:28:18 +0530 Last file access : Thu, 28 Dec 17 00:53:27 +0530 Last file modification : Tue, 21 Nov 17 21:28:18 +0530 Hash : 9f0312d130016d103aa5fc9d16a2437e Stats for /home/lab/linux-4.14-rc8: Elapsed time : 1.305767 s Start time : Sun, 07 Jan 18 03:42:39 +0530 Root hash : 434e93111ad6f9335bb4954bc8f4eca4 Hash type : md5 Depth : 8 Total, size : 66850916 bytes entries : 12484 directories : 763 regular files : 11715 symlinks : 6 block devices : 0 char devices : 0 sockets : 0 FIFOs/pipes : 0