我需要隐藏所有被拒绝的消息:
find . > files_and_folders
当这样的信息出现时,我正在做实验。我需要收集所有的文件夹和文件,它没有出现。
是否可以将权限级别直接指向files_and_folders文件?
如何同时隐藏错误?
我需要隐藏所有被拒绝的消息:
find . > files_and_folders
当这样的信息出现时,我正在做实验。我需要收集所有的文件夹和文件,它没有出现。
是否可以将权限级别直接指向files_and_folders文件?
如何同时隐藏错误?
当前回答
我不得不使用:
find / -name expect 2>/dev/null
指定我想要查找的名称,然后告诉它将所有错误重定向到/dev/null
expect是我正在搜索的expect程序的位置。
其他回答
Use:
find . ! -readable -prune -o -print
或者更一般地说
find <paths> ! -readable -prune -o <other conditions like -name> -print
避免“拒绝许可” 并且不要压制(其他)错误消息 AND获得退出状态0(“所有文件已成功处理”)
使用:find (GNU findutils) 4.4.2。 背景:
-readable测试匹配可读文件。!当test为false时,运算符返回true。和!-readable匹配不可读目录(&文件)。 -prune操作不会下降到目录中。 ! -readable -prune可以翻译为:如果目录不可读,不要进入该目录。 可读测试会考虑-perm测试忽略的访问控制列表和其他权限构件。
更多细节请参见(1)manpage。
如果你想从根目录“/”开始搜索,你可能会看到如下输出:
find: /./proc/1731/fdinfo: Permission denied
find: /./proc/2032/task/2032/fd: Permission denied
这是因为许可。要解决这个问题:
可以使用sudo命令: Sudo find /。- name“toBeSearched.file”
它要求超级用户的密码,当输入密码时,你会看到你真正想要的结果。如果您没有使用sudo命令的权限,也就是说您没有超级用户的密码,请先请求系统管理员将您添加到sudoers文件中。
You can use redirect the Standard Error Output from (Generally Display/Screen) to some file and avoid seeing the error messages on the screen! redirect to a special file /dev/null : find /. -name 'toBeSearched.file' 2>/dev/null You can use redirect the Standard Error Output from (Generally Display/Screen) to Standard output (Generally Display/Screen), then pipe with grep command with -v "invert" parameter to not to see the output lines which has 'Permission denied' word pairs: find /. -name 'toBeSearched.file' 2>&1 | grep -v 'Permission denied'
GNU find†的优化解决方案
至少对于某些系统+文件系统组合,find不需要统计文件来获取其类型。然后,您可以在测试可读性之前检查它是否是一个目录,以加快搜索‡-我在测试中获得了约30%的改进。所以对于长时间的搜索或经常运行的搜索,可以使用其中之一:
打印所有可见的东西
$ find . -print -type d ! -readable -prune
$ find . -type d ! -readable -prune , [expression] -print
打印可见文件
$ find . -type d \( ! -readable -prune -o -true \) -o [expression] -print
打印可见目录
$ find . -type d -print ! -readable -prune
$ find . -type d \( ! -readable -prune , [expression] -print \)
只打印可读目录
$ find . -type d ! -readable -prune -o [expression] -print
笔记
†可读的和,(逗号)操作符是GNU扩展。这个表达式
$ find . [expression] , [expression]
逻辑上等价于
$ find . \( [expression] -o -true \) [expression]
‡这是因为启用此优化的查找实现将避免在所讨论的用例中声明非目录文件。
编辑:shell函数
下面是一个POSIX shell函数,我最终将这个测试前置到任何表达式。它似乎可以很好地使用隐式的-print和命令行选项:
findr () {
j=$#; done=
while [ $j -gt 0 ]; do
j=$(($j - 1))
arg="$1"; shift
test "$done" || case "$arg" in
-[A-Z]*) ;; # skip options
-*|\(|!) # find start of expression
set -- "$@" \( -type d ! -readable -prune -o -true \)
done=true
;;
esac
set -- "$@" "$arg"
done
find "$@"
}
答案中列出的其他两个替代方案导致POSIX shell中的语法错误(甚至不能源包含函数定义的文件)或ZSH中的糟糕输出…运行时间似乎是相等的。
我不得不使用:
find / -name expect 2>/dev/null
指定我想要查找的名称,然后告诉它将所有错误重定向到/dev/null
expect是我正在搜索的expect程序的位置。
为了避免出现“权限被拒绝”警告,请告诉find通过从搜索中删除不可读的文件来忽略它们。将表达式作为OR添加到查找中,例如
find / \! -readable -prune -o -name '*.jbd' -ls
这主要是说(匹配一个不可读的文件并将其从列表中删除)或(匹配一个像*这样的名称。JBD和显示它[与ls])。(请记住,默认情况下表达式是AND'd,除非使用-or。)您需要在第二个表达式中使用-ls,否则find可能会添加一个默认操作来显示任何一个匹配,这也将显示所有不可读的文件。
但是如果你在你的系统中寻找真实的文件,通常没有理由去找/dev,因为那里有很多很多的文件,所以你应该添加一个表达式来排除这个目录,比如:
find / -mount \! -readable -prune -o -path /dev -prune -o -name '*.jbd' -ls
所以(匹配不可读的文件并从列表中修剪)或(匹配路径/dev并从列表中修剪)或(匹配像*。JBD并显示它)。