Come posso rimuovere le dichiarazioni di stampa "permesso negato" dal programma find?


38

Codice

find / -name netcdf

Produzione

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

Risposte:


35

Quei messaggi vengono inviati a stderr e praticamente solo quei messaggi vengono generalmente visualizzati su quel flusso di output. Puoi chiuderlo o reindirizzarlo dalla riga di comando.

$ find / -name netcdf 2>&-

o

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

Inoltre, se stai per cercare nella directory principale (/), allora è spesso utile eseguire il processo in modo che find non consumi tutte le risorse.

$ nice find / -name netcdf 2>&-

Ciò riduce la priorità del processo consentendo ad altri processi più tempo sulla CPU. Naturalmente se nient'altro sta usando la CPU, non fa nulla. :) Per essere tecnico, il valore NI (visto da ps -l) aumenta il valore PRI. Valori PRI più bassi hanno una priorità più alta. Confronta ps -lcon nice ps -l.


1
Non mi piace lanciare avvisi. È molto meglio gestirli. Inoltre, non scappare qui nel campo.
Léo Léopold Hertz

1
@ LéoLéopoldHertz 준영 WEll ... se non riesci a vedere l'output del programma perché il tuo schermo è pieno di schifezze di errore ... che è così ...
chrip

20

Vorrei solo sottolineare questa risposta di @Gilles in percorsi Exclude che fanno trovare lamentarsi delle autorizzazioni - Unix & Linux Stack Exchange ; fondamentalmente implica un costrutto perfind cui non discende directory illeggibili e, in tal senso, è probabilmente anche un po 'più veloce.

Questo sembrerebbe funzionare per me:

Con GNU findo qualsiasi altro findche supporti i predicati -readablee -executable:

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

o anche questo:

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

Per qualche motivo, ho bisogno di aggiungere tutto g+r,u+r,o+r (scorciatoia per quello a+r), altrimenti se uno di loro viene lasciato fuori, potrei ancora ottenere colpi "Autorizzazione negata".

Ecco un dettaglio di come lo vedo (nota che l' -aoperatore (e) findè implicito tra due predicati ):

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

Nota che senza l'ultimo -print, visualizzo alcuni oggetti extra (che non hanno nulla a che fare con -name 'netcdf'); le -printassicura che solo le partite di nome sono stampati (se presenti).


2
Se find(1)non riesci a scendere in una directory, non lo farà. Quindi, controllando in anticipo se è possibile aggiungere semplicemente lavoro (controllare due volte), e quindi rallentarlo.
vonbrand,

3
@vonbrand è necessario se si fa affidamento sullo findstato di uscita, poiché questi errori di autorizzazione rendono l' finduscita con stato diverso da zero
Ernest A

Non riesco a far funzionare la tua proposta. Non ottengo output quando l'output previsto è pieno. unix.stackexchange.com/q/290791/16920 Tuttavia, penso che altrimenti penso che il tuo metodo sia il modo migliore di procedere.
Léo Léopold Hertz

1
Wow, non riesco a credere che sia stata così difficile trovare questa risposta, ora vorrei poter fare di più che votarla.
Wed

8

Usa locate(1)invece:

$ locate netcdf

Mostrerà solo i file che l'utente può vedere.


1
Questo presuppone che updatedbsia in esecuzione regolarmente. Questo non è il caso di tutti i sistemi Linux.
Arcege,

3
Se Locate (1) è installato, il suo database dovrebbe essere aggiornato periodicamente. Se ciò non accade, classificherei che un'errata configurazione piuttosto che un difetto di individuare (1). Inoltre, bastano pochi minuti per eseguirlo manualmente nei rari casi in cui stai cercando un file che è stato aggiunto dall'ultimo aggiornamento del DB. Mi ritrovo a farlo forse una mezza dozzina di volte all'anno, un sovraccarico facilmente pagato dal vantaggio di velocità di Locate (1) rispetto a Find (1).
Warren Young,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.