Como removo as instruções de impressão "permissão negada" do programa find?

38

Código

find / -name netcdf

Saída

find: `/root/.dbus': Permission denied
find: `/root/.gconf': Permission denied
find: `/root/.gconfd': Permission denied
find: `/root/.gnome': Permission denied
find: `/root/.gnome2': Permission denied
find: `/root/.gnome2_private': Permission denied
InquilineKea
fonte
Relacionado: unix.stackexchange.com/q/290791/16920
Léo Léopold Hertz 준영

Respostas:

35

Essas mensagens são enviadas para o stderr e, basicamente, apenas essas mensagens são vistas no fluxo de saída. Você pode fechá-lo ou redirecioná-lo na linha de comando.

$ find / -name netcdf 2>&-

ou

$ find / -name netcdf 2>/dev/null

Além disso, se você estiver pesquisando no diretório raiz (/), geralmente é bom agradar o processo, para que o find não consuma todos os recursos.

$ nice find / -name netcdf 2>&-

Isso diminui a prioridade do processo, permitindo que outros processos passem mais tempo na CPU. Obviamente, se nada mais estiver usando a CPU, ela não fará nada. :) Para ser técnico, o valor NI (visto em ps -l) aumenta o valor PRI. Valores PRI mais baixos têm uma prioridade mais alta. Compare ps -lcom nice ps -l.

Arcege
fonte
1
Eu não gosto de jogar avisos. É muito melhor lidar com eles. Além disso, não há como escapar aqui no campo.
Léo Léopold Hertz
1
@ LéoLéopoldHertz ll VAMOS ... se você não pode ver a saída do programa porque sua tela está cheia de porcaria de erro .. que é esse o caso ...
chrips
20

Gostaria apenas de salientar esta resposta do @Gilles em Excluir caminhos que fazem com que a reclamação seja encontrada sobre permissões - Unix e Linux Stack Exchange ; basicamente envolve uma construção para findque não desça diretórios ilegíveis e, nesse sentido, provavelmente também é um pouco mais rápido.

Isso parece funcionar para mim:

Com o GNU findou qualquer outro findque suporte os predicados -readablee -executable:

find / -type d ! \( -readable -executable \) -prune -o -type f -name netcdf -print

ou também isso:

find / -type d ! -perm -g+r,u+r,o+r -prune -o -type f -name 'netcdf' -print

Por algum motivo, preciso adicionar todo o g+r,u+r,o+r(atalho para isso éa+r ), caso contrário, se um deles for deixado de fora, ainda posso receber ocorrências "Permissão negada".

Aqui está um detalhamento de como eu vejo isso (observe que o -aoperador (e) findestá implícito entre dois predicados ):

find /         # find starting from path /
  -type d        # match type is directory
  ! -perm -a+r   # (and) match not permissions of `r`ead present 
  -prune         # ignore what matched above and do not descend into it
  -o             # or (whatever didn't match above)
  -type f        # match type is file
  -name 'netcdf' # (and) match name is 'netcdf'
  -print         # print what matched above

Note que, sem o último -print, recebo alguns itens extras mostrados (que não têm nada a ver com -name 'netcdf'); os -printgarante que apenas o nome corresponde são impressos (se qualquer).

sdaau
fonte
2
Se find(1)não puder descer para um diretório, não será. Portanto, verificar com antecedência se pode ou não adicionar trabalho (verifique duas vezes) e, assim, diminua a velocidade.
vonbrand
3
@vonbrand é necessário se você confiar no findstatus de saída, porque esses erros de permissão findsaem com status diferente de zero
Ernest A
Não consigo fazer sua proposta funcionar. Não recebo saída quando a saída esperada está cheia. unix.stackexchange.com/q/290791/16920 No entanto, acho que de outra forma acho que seu método é o melhor caminho a percorrer.
Léo Léopold Hertz
1
Uau, não acredito que foi tão difícil encontrar essa resposta, agora desejo poder fazer mais do que apenas votá-la.
Wedge
8

Use em locate(1)vez disso:

$ locate netcdf

Ele mostrará apenas os arquivos que seu usuário pode ver.

Warren Young
fonte
1
Isso pressupõe que updatedbestá sendo executado regularmente. Esse não é o caso em todos os sistemas Linux.
Arcege 26/08/11
3
Se o localizador (1) estiver instalado, seu banco de dados deverá ser atualizado periodicamente. Se isso não estiver acontecendo, eu classificaria isso como uma configuração incorreta, em vez de uma falha na localização (1). Além disso, leva apenas alguns minutos para executá-lo manualmente nos raros casos em que você está procurando um arquivo que foi adicionado desde a última atualização do banco de dados. Eu me vejo fazendo isso talvez meia dúzia de vezes por ano, uma sobrecarga facilmente paga pela vantagem da velocidade de localizar (1) sobre encontrar (1).
22711 Warren Young