我正在使用 hashdeep 来计算文件的校验和。但是,我需要排除某些目录,因此解决方案似乎是使用
find
将文件列表提供给 hashdeep。这基本上运作良好。
hashdeep -c md5 -f <(find . -type f -and -not -path '\./excludeme*')
为了测试,可以简化为:
hashdeep -c md5 -f <(find . -type f)
问题是我开始看到以不幸的方式命名的文件。例如它们的文件名中有一个回车符。我没有把它放在那里,但这不是我去修复它的地方。
我们可以使用以下方法制作这样的文件:
touch file$'\r'
hashdeep 本身就可以解决这个问题:
$ hashdeep -c md5 -r .
%%%% HASHDEEP-1.0
%%%% size,md5,filename
## Invoked from: /home/myusername/hashdeeptest
## $ hashdeep -c md5 -r .
##
0,d41d8cd98f00b204e9800998ecf8427e,/home/myusername/hashdeeptest/file
如果我使用上面的
find
调用,我会得到:
./file: No such file or directory
我怀疑有某种方法可以让
find
以一种令人满意的方式将文件名提供给hashdeep
,但目前我无法做到。
非常感谢您提供解决方案!
您面临的问题是由于
find
处理文件名中不可打印字符的方式造成的。
当
find
遇到名称中带有回车符(\r
)的文件时,它将其视为一个单独的参数,导致文件名被拆分为多个部分。
要处理此问题,您可以将
-print0
选项与 find
一起使用,该选项使用空字符 (\0
) 而不是换行符分隔文件名。然后,您可以使用 -0
选项和 hashdeep
来正确处理以 null 结尾的文件名。
这是修改后的命令:
hashdeep -c md5 -f <(find . -type f -print0) -0
此命令将正确处理包含不可打印字符(如回车符)的文件名。