当find
调用时找不到任何文件时,它仍然以代码 0 退出。有没有办法让它在未找到文件时返回指示失败的退出代码?
答案1
如果您grep
支持读取 NUL 分隔行(例如 GNU 的grep
)-z
,您可以使用它来测试 是否输出了任何内容find
:
find /some/path -print0 | grep -qz .
要将数据通过管道传输到另一个命令,您可以删除该-q
选项,让grep
数据保持不变,同时如果没有任何结果仍然报告错误:
find /some/path -print0 | grep -z . | ...
具体来说,${PIPESTATUS[1]}
在 bash 中应该保存 的退出状态grep
。
如果您find
不支持-print0
,请使用 grep without-z
并希望文件名中的换行符不会引起问题:
find ... | grep '^' | ...
在这种情况下,使用^
而不是.
可能更安全。如果输出有连续的换行符,^
则会忽略它们,但.
不会。
答案2
您专门要求返回代码...我在选项中没有看到。但这就是我解决它的方法(因为grep -z
不在Mac端口上):
如果找到 1 行,则给出代码 0
test 1 == `find */.kitchen/ -name private_key | wc -l`
所以...
if [ 0 == `find */.kitchen/ -name my-file.txt | wc -l` ] ; then
echo "Nothing found"; exit;
fi
另外,作为通用解决方案,这可能很有用:
答案3
我很晚才回答这个问题,但我刚刚找到了一个优雅的答案:-)
find . -type d -empty -and -not -name . -print -exec rmdir {} + | \
awk '{print} END {if (NR == 0) {exit(1)}}'
find
这里在当前目录中查找空目录,
删除空目录,
将删除的目录的名称打印到管道,
awk
打印输出find
,如果没有找到输出NR == 0
,则使用错误代码退出。
这意味着我现在可以迭代删除空目录:
while find . -type d -empty -and -not -name . -print -exec rmdir {} + | \
awk '{print} END {if (NR == 0) {exit(1)}}'; \
do echo; done
将“我的”find
参数替换为您的参数,如果您不想在终端中看到 的输出,awk
则保留该部分,或者不保留该部分,然后“瞧”。{print}
find