如何 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
工作:stderr
stdout
less ~/.nvm/versions/node/v5.5.0/lib/node_modules/* 2>&1 | grep "Not a file"