从bash循环中抑制错误消息

时间:2014-11-26 18:11:51

标签: bash debian

我的bash脚本中有以下行:

for i in $(find ./TTDD* -type f)
    do

当目录中有文件时它会起作用,但当它为空时我得到以下内容:

find ... No such file or directory

如何抑制确切的错误消息,因为我正在记录输出而不关心该特定错误消息。

2 个答案:

答案 0 :(得分:1)

问题是没有任何匹配的globs扩展到自己,并且由于没有名为TTDD*的文件,你会收到此错误。

您可以用不同的方式重写它。最直接的是:

find . -path './TTDD*' -type f

这将显示相​​同的文件。

如果当前目录中还有其他目录,即使它们永远不匹配,也会浪费一些时间浏览文件。如果需要,您可以使用不太可读的find . -path . -o -not -path './TTDD*' -prune -o -type f -print短路这些目录。


注意:使用for循环遍历这些文件会破坏包含空格和各种其他特殊字符的文件。您可以将此与anubhava的答案结合起来,以安全地读取所有文件名,同时也不会抑制所有find的其他可能有用的错误消息。

while IFS= read -rd '' f; do
   printf "Processing [%s]\n" "$f"
done <  <(find . -path './TTDD*' -type f -print0 2>/dev/null)

答案 1 :(得分:0)

你怎么用“-exec”?

这样你可以将find命令的所有结果重定向到其他命令的输入,例如,假设我想找到root用户拥有的给定文件夹中的所有文件,我想要更改这些文件的所有权,这里是代码:

find ${DataFS}/Data -user root -exec chown someuser:someuser {} \; 

您使用的方法类似于

find ${DataFS}/Data -user root -print0 | xargs -0 chown someuser:someuser

哪个不理想,因为如果它找不到任何文件(例如,如果它打印出一个空字符串),它就会失败,即chown:在“someuser:someuser”之后缺少操作数