我在 HP Unix 上使用以下命令搜索大文件:
find . -type f -size +100000000c -exec ls -lrt {} \;
结果是这样的:
-rw-rw-rw- 1 qa1wrk32 test 169263642 Oct 27 12:28 ./rgs/test/qa1wrk32/DB/Dmp/intrefbl01_20111027_Backup_for_qa1ref32_CNSTRNO.dmp.gz
-rw-rw-rw- 1 qa1wrk32 test 173779937 Oct 24 16:33 ./rgs/test/qa1wrk32/DB/Dmp/qa1ref32_20111024_Backup_before_Refresh.dmp.gz
-rw-rw-rw- 1 qa1wrk32 test 105020030 Oct 31 09:53 ./rgs/test/qa1wrk32/DB/Dmp/qa1app32_20111031_R112_Before_CopyBan_from_INT01_to_ENV32_for_LISA_CNSTRNO.dmp.gz
find: cannot open ./rgs/test/maes32/master/.ssh
find: cannot open ./rgs/test/qa1oln32/.ssh
find: cannot open ./rgs/test/qa1oln32/local_tlg/bin/.adm
find: cannot search ./rgs/test/qa1wrk91/mail
我不想要 find 无法搜索或打开或其他任何内容的输出行。有没有办法过滤掉它们?更好的是,我可以find
搜索具有某些权限集的文件吗?
答案1
find
将错误打印到stderr
.如果您只想忽略它们,最简单的方法是:
find ... 2> /dev/null
find
还可以-perm
选择根据权限进行过滤。
答案2
您可以告诉find
搜索具有特定权限的文件,但这并不完全是您所需要的。您需要告诉find
不要探索您无权遍历的目录。实际上很容易告诉find
不要进入一个目录——它是-prune
主目录——但是没有简单的方法来匹配您无权遍历的目录。在GNUfind
,你可以写-readable -executable
,但是标准find
没有这样的选项(也没有惠普-UXfind
)。
您可以根据权限重建您的访问权限,但这很痛苦。在具有 ACL 的系统(HP-UX 具有 ACL)上,您还需要考虑这些。
find . -type d \
\! \( -user $(id -u) -perm -u+rx -o \
\( -group $(id -G | sed 's/ / -o -group /g') \) -perm -g+rx -o \
-perm -a+rx \) -prune -o \
-type f -size +100000000c -exec …
在实践中,除非这是一个关键任务脚本,否则您可能想要忽略来自的错误find
。 (如果它是一个关键任务脚本,请使用其他可以更好地过滤错误条件的语言编写,例如 Perl 或 Python。)