Excluir caminhos que fazem encontrar reclamações sobre permissões

4

Eu preciso gerar uma lista de arquivos a partir de um volume de disco. Alguns dos diretórios (todos os diretórios ocultos sob o diretório raiz) possuem permissões estranhas que fazem com que o find se queixe.

Eu tento excluir todos esses caminhos, mas um diretório ainda reclama:

find . -type f -not -path './.*/*'
find: ./.DocumentRevisions-V100: Permission denied

Os direitos são assim (definidos pelo sistema operacional, então eu suponho que eles não deveriam ser confundidos).

d--x--x--x root  wheel   .DocumentRevisions-V100

Como eu altero a instrução find para efetivamente omitir todos os diretórios ocultos para não reclamar. (Eu não quero fazer 2>/dev/null como eu quero saber sobre outros problemas).

    
por forthrin 21.08.2013 / 16:41

3 respostas

3

A sintaxe da descoberta é uma besta estranha, de fato. Eu acho que você pode ter sucesso com

find . -path './.*' -prune -o -type f -print

na página man do find (1) :

To ignore a whole directory tree, use -prune rather than checking every file in the tree. For example, to skip the directory 'src/emacs' and all files and directories under it, and print the names of the other files found, do something like this:

find . -path ./src/emacs -prune -o -print
    
por 21.08.2013 / 17:01
3

Com o GNU find ou qualquer outro recurso que suporte os predicados -readable e -executable :

find . -type d ! -readable ! -executable -prune -o -type f -not -path './.*/*' -print

Primeiramente, nós removemos diretórios que não são passíveis de serem preenchidos. Se essa condição não se aplicar, tente a (s) outra (s) condição (ões).

Se o seu find não tiver essas opções, você poderá corresponder às permissões do arquivo.

find . -type d ! -perm -u+rx -prune -o -type f ! -path './.*/*' -print
    
por 23.08.2013 / 03:26
0
u='-user "$USER"'
g='\('$(IFS=\ ;printf " -group %d " $(id -G))'\)'
eval "find / $u \( -perm -u=rx -o -prune \) -o \
             $g \( -perm -g=rx -o -prune \) -o \
                   -perm -o=rx -o -prune" | wc -l

Isso funciona. Como as permissões de arquivo são sempre avaliadas no nível mais específico possível, você não precisa -o r muito . Se um arquivo pertencer a algum usuário e for legível por outros e grupos, mas não pelo proprietário, algum usuário ainda não poderá lê-lo. E então você só precisa começar com a correspondência de permissão mais específica e ir descendo daí, -pruning o tempo todo.

find: '/proc/3379/task/3379/fd/5': No such file or directory
find: '/proc/3379/task/3379/fd/5': No such file or directory
find: '/proc/3379/task/3379/fd/5': No such file or directory
find: '/proc/3379/task/3379/fd/5': No such file or directory
find: '/proc/3379/task/3379/fdinfo/5': No such file or directory
find: '/proc/3379/task/3379/fdinfo/5': No such file or directory
find: '/proc/3379/task/3379/fdinfo/5': No such file or directory
find: '/proc/3379/task/3379/fdinfo/5': No such file or directory
find: '/proc/3379/fd/5': No such file or directory
find: '/proc/3379/fd/5': No such file or directory
find: '/proc/3379/fd/5': No such file or directory
find: '/proc/3379/fd/5': No such file or directory
find: '/proc/3379/fdinfo/5': No such file or directory
find: '/proc/3379/fdinfo/5': No such file or directory
find: '/proc/3379/fdinfo/5': No such file or directory
find: '/proc/3379/fdinfo/5': No such file or directory
327652

Como você pode ver, em nenhum momento existe um problema de permissões, apenas alguns problemas ocasionais com o /proc - o que é inevitável ao gerar arquivos para ler arquivos.

    
por 22.01.2016 / 18:21