![如何在 Solaris 中从“查找”中排除所有“权限被拒绝”消息](https://linux22.com/image/70594/%E5%A6%82%E4%BD%95%E5%9C%A8%20Solaris%20%E4%B8%AD%E4%BB%8E%E2%80%9C%E6%9F%A5%E6%89%BE%E2%80%9D%E4%B8%AD%E6%8E%92%E9%99%A4%E6%89%80%E6%9C%89%E2%80%9C%E6%9D%83%E9%99%90%E8%A2%AB%E6%8B%92%E7%BB%9D%E2%80%9D%E6%B6%88%E6%81%AF.png)
您好,有关此主题的先前问题包含针对 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