我偶然发现了一个过滤有用行的好方法find
:只需将其通过管道传输到底部less
,当它显示(END)
在底部时,按up
箭头键,只留下正确的行。不Permission denied
,没有符号链接错误,没有别的。
find / -name foo | less
但为什么?无法找到有关此行为原因的答案。less
神奇地过滤掉非结果行?
答案1
find
没有“action”的应用其默认-print
操作,将完整文件名输出到标准输出。错误转到标准错误。
管道运算符仅重定向标准输出;因此,只有“正确”的文件名会发送到less
,其他所有内容都会发送到标准错误,即您的终端。less
还写入您的终端,因此您最初会在屏幕上看到文件名和错误;但是当您向上滚动less
(或调用导致其更新屏幕的任何其他操作)时,错误将被less
的更新覆盖,因为它只知道从的标准输出less
中看到的输入。find
要翻阅 中的完整输出less
,您还需要重定向标准错误:
find / -name foo 2>&1 | less
要完全忽略错误,请将其重定向到位存储桶:
find / -name foo 2>/dev/null | less
答案2
这与它本身无关less
。只是有两个输出流:标准输出(stdout
)和标准错误(stderr
)。正如您所期望的,错误消息将转到stderr
,而常规输出将转到stdout
。默认情况下,管道仅捕获stdout
并忽略stderr
.由于 find 的错误位于 中stderr
,因此这些错误不会发送到less
,这就是为什么它看起来像是less
过滤掉错误的原因。