如何 grep stderr?

如何 grep stderr?

如何 grep 这个包含通配符的命令?

我如何 grep标准错误

grep 似乎没有做任何事情:

$ less /Users/raine/.nvm/versions/node/v5.5.0/lib/node_modules/* | grep "Not a file"
/Users/raine/.nvm/versions/node/v5.5.0/lib/node_modules/truffle is a directory
/Users/raine/.nvm/versions/node/v5.5.0/lib/node_modules/wunderline is a directory
/Users/raine/.nvm/versions/node/v5.5.0/lib/node_modules/yo is a directory

这是 less 的一个非常hacky的使用,可能值得另一个问题,但我的目的是在这个目录中找到损坏的符号链接。碰巧的是,is a directory如果它有效,Not a file or directory如果它无效,就会打印 less 。我认为无论如何还是值得一问,因为这表明我对通配符运算符stderr 缺乏了解。

答案1

通配符与 无关grep,所grep看到的只是通过管道传递给它的内容。通配符由 shell 展开,并将其展开的文件列表传递给less.所以这个问题与 根本没有关系grep

也就是说,如果您正在寻找损坏的链接,您可以执行以下操作:

for f in /Users/raine/.nvm/versions/node/v5.5.0/lib/node_modules/*; do
     [ -e $(readlink -f "$f") ] || echo "$f"; 
done

这将迭代 中的所有文件和目录/Users/raine/.nvm/versions/node/v5.5.0/lib/node_modules/,检查它们的目标是否存在(readlink如果该文件不是链接,则打印运行 iot 的文件名),如果不存在则打印名称。


一个更好的解决方案我刚刚了解到是:

find /Users/raine/.nvm/versions/node/v5.5.0/lib/node_modules/ -xtype l 

在本例中,将-xtype测试链接的目标是否是链接,因此仅适用于悬空链接。

答案2

正如 @SatoKatsura 在其评论中指出的那样, 的 (hacky) 用法less是输出到stderr,而 grep 则从 读取。虽然对于查找死符号链接的实际任务来说,这是一个糟糕的解决方案,但它可以通过重定向到 来stdout工作:stderrstdout

less ~/.nvm/versions/node/v5.5.0/lib/node_modules/* 2>&1 | grep "Not a file"

相关内容