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

find . > files_and_folders

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

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

如何同时隐藏错误?


当前回答

虽然上述方法不能解决Mac OS X的情况,因为Mac OS X不支持可读开关,这是如何避免在输出中出现“权限拒绝”错误的。这可能会帮助到某些人。

查找/ -type f -name "your_pattern" 2>/dev/null。

例如,如果您使用find命令来查找目录中某些模式的文件的大小,2>/dev/null仍然可以工作,如下所示。

找到。-type f -name "your_pattern" -exec du -ch {} + 2>/dev/null | grep total$。

这将返回给定模式的文件的总大小。注意find命令末尾的2>/dev/null。

其他回答

Use:

find . 2>/dev/null > files_and_folders

当然,这不仅隐藏了Permission denied错误,还隐藏了所有错误消息。

如果你真的想保留其他可能的错误,比如符号链接上的跳数太多,而不是权限被拒绝的那些,那么你可能不得不大胆猜测你没有很多被称为“权限被拒绝”的文件,然后尝试:

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

如果你只想过滤标准误差,你可以使用更精细的结构:

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

The I/O redirection on the find command is: 2>&1 > files_and_folders |. The pipe redirects standard output to the grep command and is applied first. The 2>&1 sends standard error to the same place as standard output (the pipe). The > files_and_folders sends standard output (but not standard error) to a file. The net result is that messages written to standard error are sent down the pipe and the regular output of find is written to the file. The grep filters the standard output (you can decide how selective you want it to be, and may have to change the spelling depending on locale and O/S) and the final >&2 means that the surviving error messages (written to standard output) go to standard error once more. The final redirection could be regarded as optional at the terminal, but would be a very good idea to use it in a script so that error messages appear on standard error.

这个主题有无穷无尽的变化,取决于你想做什么。这将在任何带有任何Bourne shell衍生物(Bash, Korn,…)的Unix变体和任何posix兼容版本的find上工作。

如果您希望适应系统上的find的特定版本,可能有可用的替代选项。特别是GNU find有许多其他版本没有的选项-请参阅当前接受的一组选项的答案。

您可以使用grep -v逆匹配

-v, --invert-match        select non-matching lines

是这样的:

find . > files_and_folders
cat files_and_folders | grep -v "permission denied" > 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中的糟糕输出…运行时间似乎是相等的。

为了避免出现“权限被拒绝”警告,请告诉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并显示它)。

只需使用它在系统中搜索文件。

find / name YOUR_SEARCH_TERM 2>&1 | grep YOUR_SEARCH_TERM

我们不要做不必要的工程,你只是想搜索你的文件,对吧?然后,如果文件出现在您可访问的区域,该命令将为您列出文件。