我需要隐藏所有被拒绝的消息:

find . > files_and_folders

当这样的信息出现时,我正在做实验。我需要收集所有的文件夹和文件,它没有出现。

是否可以将权限级别直接指向files_and_folders文件?

如何同时隐藏错误?


当前回答

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中的糟糕输出…运行时间似乎是相等的。

其他回答

重定向标准错误。例如,如果你在unix机器上使用bash,你可以像这样将标准错误重定向到/dev/null:

find . 2>/dev/null >files_and_folders

这些错误被打印到标准错误输出(fd 2)。要过滤它们,只需将所有错误重定向到/dev/null:

find . 2>/dev/null > some_file

或者首先连接stderr和stdout,然后grep出那些特定的错误:

find . 2>&1 | grep -v 'Permission denied' > some_file

我不得不使用:

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。

如果您正在使用CSH或TCSH,这里有一个解决方案:

( find . > files_and_folders ) >& /dev/null

如果你想输出到终端:

( find . > /dev/tty ) >& /dev/null

然而,正如“CSH -whynot”常见问题所描述的那样,您不应该使用CSH。