Используйте параметр -readable
для find
(при условии, что современная система использует GNU findutils ):
Соответствует файлам, которые доступны для чтения.
Это учитывает доступ
контрольные списки и другие разрешения
артефакты, которые
тест игнорирует. Этот тест использует системный вызов access (2) и
так могут быть одурачены серверами NFS, которые
сделать UID-сопоставление (или сжатие корня),
так как многие системы реализуют доступ (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));
}
* * 1 022, например,
% find / -print0 | access_test | xargs -0 -n 1 do_cmd
но обратите внимание, что это все равно будет генерировать ошибки вывода на stderr
, так как find
пытается перейти в каталоги, для которых у него нет разрешения. Параметр print0
для find
(и xargs -0
) предназначен для того, чтобы система работала с именами файлов со встроенными пробелами в них.