Wie entferne ich Ausdruckanweisungen, denen die Berechtigung verweigert wurde, aus dem Suchprogramm?

38

Code

find / -name netcdf

Ausgabe

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
quelle
Related: unix.stackexchange.com/q/290791/16920
Léo Léopold Hertz 준영

Antworten:

35

Diese Nachrichten werden an stderr gesendet, und im Allgemeinen werden nur diese Nachrichten in diesem Ausgabestream angezeigt. Sie können es in der Befehlszeile schließen oder umleiten.

$ find / -name netcdf 2>&-

oder

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

Wenn Sie das Stammverzeichnis (/) durchsuchen möchten, ist es häufig hilfreich, den Vorgang zu vereinfachen, damit bei der Suche nicht alle Ressourcen verbraucht werden.

$ nice find / -name netcdf 2>&-

Dies verringert die Priorität des Prozesses und lässt anderen Prozessen mehr Zeit für die CPU. Natürlich, wenn nichts anderes die CPU benutzt, tut sie nichts. :) Um technisch zu sein, ps -lerhöht der NI-Wert (von ) den PRI-Wert. Niedrigere PRI-Werte haben eine höhere Priorität. Vergleichen Sie ps -lmit nice ps -l.

Arcege
quelle
1
Ich mag es nicht, Warnungen auszusprechen. Es ist viel besser damit umzugehen. Auch hier im Feld kein Entkommen.
Léo Léopold Hertz 준영
1
@ LéoLéopoldHertz 준영 WEll ... wenn Sie keine Programmausgabe sehen können, weil Ihr Bildschirm voller Fehler ist .. was der Fall ist ...
chrips
20

Ich möchte nur auf diese Antwort von @Gilles in Ausschlusspfade hinweisen, bei denen sich jemand über Berechtigungen beschwert - Unix & Linux Stack Exchange ; es handelt sich im Grunde genommen um ein Konstrukt find, mit dem es keine unlesbaren Verzeichnisse herabführt, und in diesem Sinne ist es wahrscheinlich auch ein bisschen schneller.

Das scheint bei mir zu funktionieren:

Mit GNU findoder einem anderen find, der das -readableund -executablePrädikate unterstützt:

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

oder auch das:

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

Aus irgendeinem Grund muss ich alle hinzufügen g+r,u+r,o+r(Abkürzung dafür ist a+r), andernfalls erhalte ich möglicherweise immer noch Treffer mit "Erlaubnis verweigert", wenn eine davon weggelassen wird.

Hier ist eine Aufschlüsselung, wie ich dies sehe (beachten Sie, dass der -aOperator (und) in zwischen zwei Prädikaten impliziertfind ist ):

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

Beachten Sie, dass ohne die letzte -printOption einige zusätzliche Elemente angezeigt werden (die nichts damit zu tun haben -name 'netcdf'). das -printgewährleistet , dass nur die Namen Streichhölzer gedruckt werden (falls vorhanden).

sdaau
quelle
2
Wenn Sie find(1)nicht in ein Verzeichnis absteigen können, wird dies nicht der Fall sein. Prüfen Sie also im Voraus, ob es möglich ist oder nicht, und fügen Sie Arbeit hinzu (überprüfen Sie es zweimal), und verlangsamen Sie es so.
Vonbrand
3
@vonbrand ist erforderlich, wenn Sie sich auf den Beendigungsstatus von verlassen find, da diese Berechtigungsfehler dazu führen, dass der find
Ernest A
Ich kann Ihren Vorschlag nicht umsetzen. Ich erhalte keine Ausgabe, wenn die erwartete Ausgabe voll ist. unix.stackexchange.com/q/290791/16920 Ansonsten denke ich jedoch, dass Ihre Methode der beste Weg ist.
Léo Léopold Hertz 준영
1
Wow, ich kann nicht glauben, dass es so schwer war, diese Antwort zu finden. Ich wünschte, ich könnte mehr tun, als sie nur zu verbessern.
Wedge
8

Verwenden Sie locate(1)stattdessen:

$ locate netcdf

Es werden nur Dateien angezeigt, die der Benutzer sehen kann.

Warren Young
quelle
1
Dies setzt voraus, dass updatedbregelmäßig ausgeführt wird. Dies ist nicht auf allen Linux-Systemen der Fall.
Arcege
3
Wenn lokalisiert (1) installiert ist , seine Datenbank sollte regelmäßig aktualisiert werden. Wenn das nicht passiert, würde ich das eher als Fehlkonfiguration als als Fehler von locate (1) bezeichnen. In den seltenen Fällen, in denen Sie nach einer Datei suchen, die seit dem letzten DB-Update hinzugefügt wurde, dauert die manuelle Ausführung nur wenige Minuten. Ich mache das vielleicht ein halbes Dutzend Mal im Jahr, ein Aufwand, der sich leicht aus dem Geschwindigkeitsvorteil von locate (1) gegenüber find (1) bezahlt macht.
Warren Young