我的问题(在带有的脚本中#!/bin/sh
)如下:我尝试出于归档目的对目录中的所有文件进行校验和。具有所有文件名的校验和(在我的情况下为sha1)文件应位于同一目录中。假设我们有一个~/test
包含文件f1
和的目录f2
。
mkdir ~/test
cd ~/test
echo "hello" > f1
echo "world" > f2
现在用
find -maxdepth 1 -type f -printf '%P\n' | xargs shasum
完全符合我的要求,它仅列出当前目录的所有文件并计算sha1和(maxdepth可能在以后更改)。STDOUT上的输出为:
f572d396fae9206628714fb2ce00f72e94f2258f f1
9591818c07e900db7e1e0bc4b884c945e6a61b24 f2
不幸的是,当尝试使用
find -maxdepth 1 -type f -printf '%P\n' | xargs shasum > sums.sha1
生成的文件将显示自身的校验和:
da39a3ee5e6b4b0d3255bfef95601890afd80709 sums.sha1
f572d396fae9206628714fb2ce00f72e94f2258f f1
9591818c07e900db7e1e0bc4b884c945e6a61b24 f2
并因此在以后失败shasum --check
,这是因为在保存最后一笔款项时显然会进行其他文件修改的问题。
我环顾四周,并使用-p
标志xargs
,我发现它甚至在执行find命令之前就以某种方式创建了输出文件,因此找到了附加文件并将其校验和...
我知道作为一种解决方法,我可以将校验和保存到另一个位置(通过进行临时目录mktemp
),或者将其排除在find之外,但是我想了解为什么它的行为方式如此-在我看来这没什么用,例如,如果第一个命令将检查输出文件是否已经在磁盘上,它将永远不会获得正确的答案...
sh
调用,也不能保证能正常工作。请注意,您需要一个$0
before 的参数{}
。
tee
已消失?我尝试了一下,效果很好,还添加了来抑制STDOUT 1>/dev/null
。答案是否有问题或是错误?
xargs
,而是shell本身创建了该文件,因为在执行任何命令之前, shell都会重定向所有输入,输出和管道,因此find
启动时输出文件已经存在。使用-exec
来代替:find -maxdepth 1 -type f -exec sh -c 'shasum "$@" > sums.sha1' {} +