Bash 我怎样才能排除所有的“;“拒绝许可”;来自「;找到“;?

Bash 我怎样才能排除所有的“;“拒绝许可”;来自「;找到“;?,bash,error-handling,find,file-permissions,Bash,Error Handling,Find,File Permissions,我需要从以下位置隐藏所有被拒绝权限的邮件: find . > files_and_folders 当这样的信息出现时,我正在进行实验。我需要收集所有的文件夹和文件,它不会出现 是否可以将权限级别指向文件和文件夹文件 如何同时隐藏错误?使用: find . 2>/dev/null > files_and_folders 当然,这不仅隐藏了被拒绝的权限错误,还隐藏了所有错误消息 如果您真的想保留其他可能的错误,例如符号链接上的跳数过多,而不是拒绝权限的错误,那么您可能需要快速猜

我需要从以下位置隐藏所有被拒绝权限的邮件:

find . > files_and_folders
当这样的信息出现时,我正在进行实验。我需要收集所有的文件夹和文件,它不会出现

是否可以将权限级别指向
文件和文件夹
文件

如何同时隐藏错误?

使用:

find . 2>/dev/null > files_and_folders
当然,这不仅隐藏了被拒绝的
权限
错误,还隐藏了所有错误消息

如果您真的想保留其他可能的错误,例如符号链接上的跳数过多,而不是拒绝权限的错误,那么您可能需要快速猜测您没有太多名为“拒绝权限”的文件,然后尝试:

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

如果严格地只想过滤标准错误,可以使用更精细的构造:

find . 2>&1 > files_and_folders | grep -v 'Permission denied' >&2
find
命令上的I/O重定向是:
2>&1>文件和文件夹|
。 管道将标准输出重定向到
grep
命令,并首先应用。
2>&1
将标准误差发送到与标准输出(管道)相同的位置。
>文件和文件夹将标准输出(但不是标准错误)发送到文件。最终的结果是,写入标准错误的消息被发送到管道中,
find
的常规输出被写入文件中。
grep
过滤标准输出(您可以决定您希望它的选择性,并且可能必须根据区域设置和O/S更改拼写),最后的
&2
意味着剩余的错误消息(写入标准输出)再次进入标准错误。在终端上,最终重定向可以被视为可选的,但是在脚本中使用它是一个非常好的主意,这样错误消息就会出现在标准错误页面上

这个主题有无限的变化,这取决于你想做什么。这将适用于带有任何Bourne shell衍生产品(Bash、Korn等)的任何Unix变体以及任何兼容POSIX的版本


如果您希望适应系统上的
find
的特定版本,可能有其他可用选项。GNU
find
尤其有许多其他版本中不可用的选项-请参阅当前接受的答案以了解其中一组选项。

重定向标准错误。例如,如果您在unix计算机上使用bash,可以将标准错误重定向到/dev/null,如下所示:

find . 2>/dev/null >files_and_folders
find . > files_and_folders
cat files_and_folders | grep -v "permission denied" > files_and_folders

使用2>/dev/null


find-名称“…”2>/dev/null

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

find . 2>/dev/null > some_file
或者首先加入stderr和stdout,然后清除这些特定错误:

find . 2>&1 | grep -v 'Permission denied' > some_file
我必须使用:

find / -name expect 2>/dev/null
指定我要查找的内容的名称,然后告诉它将所有错误重定向到/dev/null


expect是我正在搜索的expect程序的位置。

如果要从根“/”开始搜索,可能会看到如下输出:

find: /./proc/1731/fdinfo: Permission denied
find: /./proc/2032/task/2032/fd: Permission denied
这是因为允许。要解决这个问题:

  • 您可以使用sudo命令:

    sudo find /. -name 'toBeSearched.file'
    
  • 它询问超级用户的密码,当输入密码时,您将看到您真正想要的结果。如果您没有使用sudo命令的权限,这意味着您没有超级用户的密码,请首先要求系统管理员将您添加到sudoers文件中

  • 您可以使用重定向将标准错误输出从(通常显示/屏幕)重定向到某个文件,避免在屏幕上看到错误消息!重定向到特殊文件/dev/null:

    find /. -name 'toBeSearched.file' 2>/dev/null
    
  • 您可以使用将标准错误输出从(一般显示/屏幕)重定向到标准输出(一般显示/屏幕),然后使用带-v“invert”参数的grep命令管道,以不查看具有“权限被拒绝”字对的输出行:

    find /. -name 'toBeSearched.file' 2>&1 | grep -v 'Permission denied'
    

  • 您还可以使用
    -perm
    -prune
    谓词,以避免降级到不可读的目录中(另请参阅):

    使用:

    或者更一般地说

    find <paths> ! -readable -prune -o <other conditions like -name> -print
    
    查找-可读-修剪-o-打印
    
    • 避免“拒绝许可”
    • 并且不抑制(其他)错误消息
    • 并获取退出状态0(“所有文件均已成功处理”)
    使用:find(GNU findutils)4.4.2。 背景:

    • -readable
      测试与可读文件匹配。
      运算符返回true。和
      -可读的
      匹配不可读的目录和文件
    • -prune
      操作不会下降到目录中
    • -可读-prune
      可以翻译为:如果目录不可读,请不要进入目录
    • -readable
      测试考虑了访问控制列表和
      -perm
      测试忽略的其他权限人工制品
    有关更多详细信息,请参见。

    要避免出现“权限被拒绝”警告,请告诉find通过从搜索中删除不可读的文件来忽略这些文件。将表达式作为或添加到查找中,例如

    find / \! -readable -prune -o -name '*.jbd' -ls
    
    这主要是指(匹配一个不可读的文件并将其从列表中删除)或(匹配像*.jbd这样的名称并[用ls]显示它)。(请记住,在默认情况下,除非使用-or,否则表达式是和的。)您需要在第二个表达式中使用-ls,否则find可能会添加一个默认操作来显示其中一个匹配项,这也将显示所有不可读的文件

    但是,如果要在系统上查找真实文件,通常没有理由在/dev中查找,因为/dev有许多文件,因此您应该添加一个排除该目录的表达式,如:

    find / -mount \! -readable -prune  -o  -path /dev -prune  -o  -name '*.jbd' -ls
    
    所以(匹配不可读文件并从列表中删除)或(匹配路径/dev并从列表中删除)或(匹配类似*.jbd的文件并显示它)。

    使用

    sudo find / -name file.txt
    
    这很愚蠢(因为你
    sudo find / -name file.txt
    
    find . > files_and_folders 2> >(grep -v 'Permission denied' >&2)
    
    find . 2>&1 >files_and_folders | grep -v 'Permission denied' >&2
    
    find . 2>&1 >files_and_folders | { grep -v 'Permission denied' >&2; [ $? -eq 1 ]; }
    
    { find . 3>&2 2>&1 1>&3 | grep -v 'Permission denied' >&3; } 3>&2 2>&1
    
    it is a directory AND has no read access AND/OR has no execute access
    
    -type d ! -readable ! -executable -prune
    
    it is directory AND no read access AND no execute access
    
    has read access AND has execute access
    
    -v, --invert-match        select non-matching lines
    
    find . > files_and_folders
    cat files_and_folders | grep -v "permission denied" > files_and_folders
    
    alias search='find / -name $file 2>/dev/null'
    
    $ file=<filename or mask>; search
    
    ( find . > files_and_folders ) >& /dev/null
    
    ( find . > /dev/tty ) >& /dev/null