2009-02-07 5 views
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 ... 

Если это возможно, я хотел бы его в общем виде, так что я может использовать ту же командную строку, независимо от того, какой пользователь я зарегистрирован как, но все равно получить эти файлы и каталоги, которые я могу увидеть в результате поиска.

ответ

3

Используйте опцию -readable для find (предполагая, что современная система с использованием GNU findutils):

соответствий файлов, которые могут быть прочитаны. Это учитывает доступ контрольных списков и других разрешений Артефакты, которые -perm тест игнорируется. В этом тесте используется системный вызов access (2) и , поэтому его можно обмануть серверами NFS, которые выполняют отображение UID (или root-squashing), , поскольку многие системы реализуют доступ (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) предназначена для обеспечения того, чтобы система работала с именами файлов со встроенными пространствами в них.

+0

Спасибо. Да, я смотрел на -перм до публикации, и это, похоже, не для меня. И кажется, что я не использую современную систему, я использую Fedora в настоящий момент, и, по-видимому, это не работает. – 2009-02-07 18:59:41

+0

Он присутствует на моей системе Fedora 10. – Alnitak

+0

У меня есть релиз Fedora 7 (Moonshine), где я (в университете), и у меня нет прав администратора. Когда я возвращаюсь домой, у меня есть Ubuntu 8.04, и я уверен, что это тоже. :-) – 2009-02-07 20:16:15