0

例子:

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 ...

如果可能的话,我希望以一种通用的方式使用它,这样无论我以哪个用户身份登录,我都可以使用相同的命令行,但仍然可以获得我可能从 find 中看到的那些文件和目录。

4

1 回答 1

3

使用该-readable选项find(假设使用 GNU findutils的现代系统):

匹配可读的文件。这考虑了 -perm 测试忽略的访问控制列表和其他权限伪影。该测试使用了 access(2) 系统调用,因此可能会被执行 UID 映射(或 root-squashing)的 NFS 服务器所欺骗,因为许多系统在客户端的内核中实现 access(2),因此无法使用服务器上保存的 UID 映射信息。

使用-perm和变体不起作用,因为它只查看文件的标志,而不是这些标志是否允许访问。

如果你没有,你-readable可以find通过这个简单的 Perl 脚本输出 ,它只输出所提供的可读文件的文件名:

#!/usr/bin/perl -w

use POSIX qw[access];
use strict;

foreach (split(/\0/, <STDIN>)) {
    print $_ . "\0" if (POSIX::access($_, &POSIX::R_OK));
}

例如

% find / -print0 | access_test | xargs -0 -n 1 do_cmd

但请注意,这仍然会在尝试递归到它没有权限的目录时产生输出stderr错误find。( 和)的print0选项是为了确保系统可以处理带有嵌入空格的文件名。findxargs -0

于 2009-02-07T18:08:44.777 回答