一开始我有这个脚本,将标准输出放入 file.txt 中:
find .. -type f -not \( -path '/dev/*' -or -path '/proc/*' -or -path '/sys/devices/*' \) -print0 |
xargs -0 bash -c 'paste -d ";" <(md5sum "$@") <(sha1sum "$@") <(sha256sum "$@") <(du -lh "$@")' bash
但是它会返回 5 次带有空格的路径,这使得解析变得困难。
所以我这样做了:
find / -type f -not \( -path '/dev/*' -or -path '/proc/*' -or -path '/sys/devices/*' \) -print0 |
xargs -0 bash -c `paste -d ";" <(md5sum "$@" | awk "{print $1}") <(sha1sum "$@" | awk "{print $1}") <(sha256sum "$@" | awk "{print $1;}") <(du -lh "$@"| awk "{print $1;}")` bash
但是不起作用
你会怎么做?
我只是不知道如何获取:md5;sha1;sha256;size;path;md5;sha1;sha256;size;path;md5;sha1;sha256;size;path;md5;sha1;sha256;size;path ;md5;sha1;sha256;大小;路径;md5;sha1;sha256;大小;路径;等等...
基本上,全部在 1 条线上。
在第二个命令中,您对
xargs -0 bash -c `...` bash
使用了反引号“引号”。它们的行为类似于 $(...)
,因此命令字符串在 find | xargs
甚至开始之前就被执行了。$1
甚至开始之前就替换了 awk
。
对于每一级引用使用一个辅助变量,带有嵌套引号的命令字符串更容易在多个步骤中编写,但由于您使用的是 bash,因此您可以导出一个函数,这使得事情变得微不足道。
f() {
paste -d ";" \
<(md5sum "$@" | awk '{print $1}') \
<(sha1sum "$@" | awk '{print $1}') \
<(sha256sum "$@" | awk '{print $1}') \
<(du -lh "$@" | awk '{print $1}')
}
export -f f
find / -type f -not \( -path '/dev/*' -or -path '/proc/*' -or -path '/sys/devices/*' \) -print0 |
xargs -0 bash -c 'f "$@"' bash
如您所愿,我们可以在一行中打印所有文件的所有字段 将每个
tr
替换为 \n
。路径不以任何方式引用。如果它们包含 ;
或换行符,则解析结果可能会很困难。如果您需要某种形式的引用,请尝试 ;
或 printf %q
。sed [-z] 's/.../.../g'