Ignorando arquivos que não podem ser pesquisados ou abertos?

3

Pesquisei arquivos grandes usando este comando no HP Unix:

find . -type f -size +100000000c -exec ls -lrt {} \;

O resultado foi algo assim:

-rw-rw-rw-   1 qa1wrk32   test       169263642 Oct 27 12:28 ./rgs/test/qa1wrk32/DB/Dmp/intrefbl01_20111027_Backup_for_qa1ref32_CNSTRNO.dmp.gz
-rw-rw-rw-   1 qa1wrk32   test       173779937 Oct 24 16:33 ./rgs/test/qa1wrk32/DB/Dmp/qa1ref32_20111024_Backup_before_Refresh.dmp.gz
-rw-rw-rw-   1 qa1wrk32   test       105020030 Oct 31 09:53 ./rgs/test/qa1wrk32/DB/Dmp/qa1app32_20111031_R112_Before_CopyBan_from_INT01_to_ENV32_for_LISA_CNSTRNO.dmp.gz
find: cannot open ./rgs/test/maes32/master/.ssh
find: cannot open ./rgs/test/qa1oln32/.ssh
find: cannot open ./rgs/test/qa1oln32/local_tlg/bin/.adm
find: cannot search ./rgs/test/qa1wrk91/mail

Eu não quero as linhas de saída em que o find não consegue pesquisar ou abrir ou qualquer outra coisa. Existe uma maneira de filtrá-los? Melhor ainda, posso fazer find procurar arquivos com algum conjunto de permissões?

    
por munish 04.11.2011 / 06:40

2 respostas

11

find imprime os erros para stderr . Se você quer apenas ignorá-los, o mais simples é:

find ... 2> /dev/null

find também tem a opção -perm para filtrar com base nas permissões.

    
por 04.11.2011 / 09:04
1

Você pode informar find para pesquisar arquivos com permissões específicas, mas não é exatamente o que você precisa aqui. Você precisa informar find para não explorar diretórios que você não tem permissão para percorrer. Na verdade, é fácil dizer find para não descer em um diretório - é o -prune primary - mas não há maneira fácil de corresponder diretórios que você não tem permissão para percorrer. Em GNU find , você pode escrever -readable -executable , mas standard find não tem essa opção (nem HP-UX find ).

Você pode reconstruir seus direitos de acesso a partir de permissões, mas é doloroso. E em sistemas que possuem ACLs (o que o HP-UX faz), você também precisa levar isso em consideração.

find . -type d \
       \! \( -user $(id -u) -perm -u+rx -o \
             \( -group $(id -G | sed 's/ / -o -group /g') \) -perm -g+rx -o \
             -perm -a+rx \) -prune -o \
     -type f -size +100000000c -exec …

Na prática, a menos que este seja um script de missão crítica, você provavelmente desejará ignore os erros de find . (E se for um script de missão crítica, escreva-o em outra linguagem que permita melhor filtragem de condições de erro, como Perl ou Python.)

    
por 04.11.2011 / 22:56