我正在尝试在 Solaris 10 上使用来find
列出一个目录的内容,不包括搜索中的子目录。我尝试了一个基于的命令sdaau建议的解决方案:
find /tmp -type d ! -perm -u+rx -prune -o -type f -name dsm\*
不幸的是,除了返回所需的结果之外,这仍然会导致如下错误:
find: cannot read dir /tmp/hsperfdata_oracle4: Permission denied
find: cannot read dir /tmp/hsperfdata_jsweb: Permission denied
/tmp 中有几个目录,执行的用户find
既没有读取也没有遍历(执行)授权。
-bash-3.2$ ls -ld /tmp/hsp*
drwxr-x--- 2 jsweb other 117 Jan 5 13:00 /tmp/hsperfdata_jsweb
drwxr-x--- 2 oracle4 dba4 117 Nov 5 19:51 /tmp/hsperfdata_oracle4
drwxr-xr-x 2 root root 117 Jan 22 08:58 /tmp/hsperfdata_root
我需要找到一种方法来消除这些错误,这样find
就不会以非零返回代码结束。我在忽略什么?
答案1
您可以丢弃这些错误并忽略退出状态:
find /tmp -name dsm\* -type f 2> /dev/null || :
如果您仍然想保留find
stderr ,仍然能够看到除由于访问权限限制而无法输入或列出目录之外的错误,您可以尝试使用检测这些权限问题的语法,但这会很棘手。
您无权访问的目录取决于权限和所有权(用户和组)。你需要类似的东西:
export "PATH=$(getconf PATH):$PATH"
u=$(id -u) g=$(id -G | sed 's/ / -o -group /g'); IFS=" "
find /tmp -type d ! \( \
-user "$u" -perm -u=rx -o \
! -user "$u" \( -group $g \) -perm -g=rx -o \
! -user "$u" ! \( -group $g \) -perm -o=rx \
\) -prune -o -type f -name dsm\* -print
话虽如此,在我的测试中,在 Solaris 11 上,find
即使您已经修剪了目录,它仍然会抱怨它无法读取目录,而在 Solaris 10 上,我什至无法让它执行任何操作,更不用说-prune
在他们。
因此,Solarisfind
在这方面似乎没有希望。您可以使用perl
'sFile::Find
模块代替。
另请注意,上述方法仅考虑简单的 Unix 权限,而不考虑 ACL 或其他安全限制。
答案2
在您的示例中,! -perm -u+rx
并不评估为真实 - 所有者仍然拥有这些权利。你应该使用! -perm -o+rx
.所以:
find /tmp -type d ! -perm -o+rx -prune -o -type f -name dsm\*
答案3
不确定您想要完成什么,但既然您不需要子目录,为什么不直接运行 als
并将其通过管道传输到grep
?或许可以用awk
或sort
来满足您的需求?
答案4
find /tmp -type d ! -perm -775 -prune -o -type f -name dsm\*