我的bash脚本中有以下行:
for i in $(find ./TTDD* -type f)
do
当目录中有文件时它会起作用,但当它为空时我得到以下内容:
find ... No such file or directory
如何抑制确切的错误消息,因为我正在记录输出而不关心该特定错误消息。
答案 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”之后缺少操作数