当没有找到任何东西时使查找失败

当没有找到任何东西时使查找失败

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

相关内容