如何在 Solaris 中从“查找”中排除所有“权限被拒绝”消息

如何在 Solaris 中从“查找”中排除所有“权限被拒绝”消息

您好,有关此主题的先前问题包含针对 Linux 的答案,但不适用于 Solaris 10。

find . ! -readable -prune

在Solaris 中不起作用,因为-read 不是POSIX。

在 Solaris 中,从“查找”中排除所有“权限被拒绝”消息的 POSIX 兼容命令是什么?

正确答案:jlliagre 和 random832 给出了正确答案。

答案1

这是一种 POSIX 方法,可以使用以下命令删除任何不可读的目录find

find . \( -exec sh -c ' if [ ! -r "$1" ] ; then { exit 1 ; } ; else for i in "$1"/* ; do if [ -d "$i" -a ! -r "$i" ]; then exit 1; fi; done; fi ' sh {} \; -o -prune \) -a -print

请注意,如果这是完整的 Solaris 安装,则 GNU grep 在/usr/sfw/bin/ggrep.

答案2

只需将它们过滤掉即可。

find . 2>&1 | grep -v "^find: cannot read dir .*: Permission denied$"

答案3

如果您不想为每个文件调用子 shell,则 jlliagre 答案的这种改进可以通过find谓词完成所有操作,只要没有 ACL 使其变得更加复杂即可。正确处理可读但不可搜索的目录留作练习。如果您以前没有见过这个#!东西,它意味着“不要尝试将所有这些复制到命令行上;相反,将其逐字放入文件中chmod +x,并将其作为 调用./nameoffile <directory>。”

#! /usr/xpg4/bin/sh

PATH=/usr/local/bin:/usr/xpg4/bin:/usr/bin:/bin
export PATH

me="-user $(id -u)"
my_groups="( -group $(id -G | sed 's/ / -o -group /g') )"

prune_me="( ( $me ! -perm -0400 ) -prune )"
prune_group="( ( ! $me $my_groups ! -perm -0040 ) -prune )"
prune_other="( ( ! $me ! $my_groups ! -perm -0004 ) -prune )"

find "$@" $prune_me -o $prune_group -o $prune_other -o -print

相关内容