Отфильтруйте результаты поиска, если я не могу прочитать файл / посмотреть содержимое каталога - PullRequest
0 голосов
/ 07 февраля 2009

Пример:

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

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

1 Ответ

3 голосов
/ 07 февраля 2009

Используйте параметр -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 для findxargs -0) предназначен для того, чтобы система работала с именами файлов со встроенными пробелами в них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...