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