示例:
find / *
给我所有文件和目录,但是我只想要那些我可能阅读的文件和那些我可以看到内容的目录。否则,当我尝试查找所有文件的文件信息时,我会遇到问题:
for i in ls $( find / * ); do file $i; done
结果是:
find: /lost+found: Permission denied
find: /proc/tty/driver: Permission denied
find: /proc/1/task/1/fd: Permission denied
find: /proc/1/fd: Permission denied
find: /proc/2/task/2/fd: Permission denied
find: /proc/2/fd: Permission denied
find: /proc/3/task/3/fd: Permission denied
# and so on ...
如果有可能我希望以通用方式使用它,这样我可以使用相同的命令行,无论我以登录哪个用户,但仍然可以获取那些文件和目录看作是查找的结果。
答案 0 :(得分:3)
使用-readable
选项find
(假设现代系统使用GNU findutils):
匹配可读的文件。 这考虑了访问权限 控制列表和其他权限 其中的人工制品 - 精子测试忽略。此测试使用access(2)系统调用,和 所以可以被NFS服务器欺骗了 做UID映射(或root-squashing), 因为许多系统实现访问(2) 在客户端的内核中,所以不能 利用UID映射 服务器上保存的信息。
使用-perm
和变体不起作用,因为它只查看文件的标志,而不是那些标志是否你访问。
如果您不拥有-readable
,您可以通过这个简单的Perl脚本管道find
的输出,该脚本只输出所提供文件的文件名可读:
#!/usr/bin/perl -w
use POSIX qw[access];
use strict;
foreach (split(/\0/, <STDIN>)) {
print $_ . "\0" if (POSIX::access($_, &POSIX::R_OK));
}
e.g。
% find / -print0 | access_test | xargs -0 -n 1 do_cmd
但请注意,这仍会在stderr
上生成输出错误,因为find
会尝试递归到它没有权限的目录中。 print0
(和find
)的xargs -0
选项用于确保系统处理包含嵌入空格的文件名。