如何从查找程序中删除“权限被拒绝”的打印输出语句?

如何从查找程序中删除“权限被拒绝”的打印输出语句?

代码

find / -name netcdf

输出

find: `/root/.dbus': Permission denied
find: `/root/.gconf': Permission denied
find: `/root/.gconfd': Permission denied
find: `/root/.gnome': Permission denied
find: `/root/.gnome2': Permission denied
find: `/root/.gnome2_private': Permission denied

答案1

这些消息被发送到 stderr,并且通常只有这些消息通常会在该输出流上看到。您可以关闭它或在命令行上重定向它。

$ find / -name netcdf 2>&-

或者

$ find / -name netcdf 2>/dev/null

另外,如果您要搜索根目录 (/),那么通常最好对进程进行优化,这样 find 就不会消耗所有资源。

$ nice find / -name netcdf 2>&-

这会降低进程的优先级,从而允许其他进程有更多的 CPU 时间。当然,如果没有其他东西在使用CPU,它就不会做任何事情。 :) 从技术角度来说,NI 值(从图中看出ps -l)会增加 PRI 值。 PRI 值越低,优先级越高。ps -l与之比较nice ps -l

答案2

我只想指出@Gilles 的这个答案排除使find抱怨权限的路径;它基本上涉及一个构造,find使其不会下降到不可读的目录中,从这个意义上说,可能也更快一点。

这对我来说似乎有用:

对于 GNUfind或任何其他find支持-readableand-executable谓词的:

find / -type d ! \( -readable -executable \) -prune -o -type f -name netcdf -print

或者还有这个:

find / -type d ! -perm -g+r,u+r,o+r -prune -o -type f -name 'netcdf' -print

由于某种原因,我需要添加所有g+r,u+r,o+r(快捷方式是a+r),否则如果遗漏其中一个,我仍然可能会遇到“权限被拒绝”的情况。

这是我如何看待这一点的细分(注意is-a中的 (and) 运算符find两个谓词之间隐含的):

find /         # find starting from path /
  -type d        # match type is directory
  ! -perm -a+r   # (and) match not permissions of `r`ead present 
  -prune         # ignore what matched above and do not descend into it
  -o             # or (whatever didn't match above)
  -type f        # match type is file
  -name 'netcdf' # (and) match name is 'netcdf'
  -print         # print what matched above

请注意,如果没有最后一个-print,我会显示一些额外的项目(与 无关-name 'netcdf');确保-print仅打印名称匹配的内容(如果有)。

答案3

改用locate(1)

$ locate netcdf

它只会显示您的用户可以看到的文件。

相关内容