943 Stimmen

Wie kann ich alle "Zugriff verweigert" Nachrichten von "find" ausschließen?

Ich muss alle Zugriff verweigert Nachrichten ausblenden von:

find . > files_and_folders

Ich experimentiere, wenn solche Nachrichten auftreten. Ich muss alle Ordner und Dateien sammeln, bei denen es nicht auftritt.

Ist es möglich, die Berechtigungsebenen auf die files_and_folders Datei umzuleiten?

Wie kann ich gleichzeitig die Fehler ausblenden?

0 Stimmen

Tolle Frage! Leider funktionieren die ersten drei Antworten einfach nicht unter Debian Linux. Oder zumindest meine Konfiguration davon. Ich brauchte Fatih's Lösung, find /. -name 'toBeSearched.file' 2>/dev/null.

0 Stimmen

Ich fand es am besten, den /proc-Pfad mithilfe der -path-Option auszuschließen. Es hilft, die -prune-Option zu verneinen, um das Drucken von ausgeblendeten Elementen zu vermeiden.

71voto

Matt Punkte 2161

Leiten Sie stderr nach /dev/null um, indem Sie 2>/dev/null verwenden

find . -name '...' 2>/dev/null

3 Stimmen

Dies funktioniert auch für mich problemlos, selbst auf Mac OSX. Oder auch find . -name '...' -print 2>/dev/null

31voto

sdaau Punkte 34279

Sie können auch die Prädikate -perm und -prune verwenden, um das Absteigen in nicht lesbare Verzeichnisse zu vermeiden (siehe auch Wie entferne ich "Permission denied"-Meldungen aus dem Find-Programm? - Unix & Linux Stack Exchange):

find . -type d ! -perm -g+r,u+r,o+r -prune -o -print > files_and_folders

5 Stimmen

-perm -g+r,u+r,o+r gleicht lediglich Dateien ab, deren r (Lesen) Berechtigung für alle 3 Sicherheitsprinzipale der Datei gesetzt ist, was keinen direkten Zusammenhang damit hat, ob der aktuelle Benutzer diese Datei lesen kann oder nicht. Es besteht die Möglichkeit, sowohl Dateien zu verpassen, die der aktuelle Benutzer lesen kann, als auch Dateien abzugleichen, die er nicht lesen kann.

0 Stimmen

Ich denke, find . -type d ! \( -perm -u+r -o -perm -g+r -o -perm -o+r \) -prune -o -print wäre die gute Lösung.

2 Stimmen

@Mattia72: Nein, es ist grundsätzlich unmöglich, -lesbar vollständig mit -perm zu emulieren - siehe meinen vorherigen Kommentar und betrachte dieses Beispiel: echo 'hallo' > datei; sudo chown nobody:nobody datei; sudo chmod o-r datei; find datei -perm -u=r gibt datei aus, weil das Leserecht des Benutzers gesetzt ist, aber es bezieht sich auf den Benutzer nobody, nicht den aktuellen Benutzer. Der aktuelle Benutzer kann diese Datei nicht lesen; versuche cat datei. Siehe auch: diese Antwort von mir.

23voto

Jason Coco Punkte 77369

Weiterleitung von Standardfehlermeldungen. Wenn Sie beispielsweise bash auf einem Unix-Rechner verwenden, können Sie den Standardfehler nach /dev/null umleiten, so:

find . 2>/dev/null >files_and_folders

20voto

Bunti Punkte 1632

Während die obigen Ansätze den Fall für Mac OS X nicht behandeln, weil Mac Os X den -readable-Schalter nicht unterstützt, so können Sie 'Permission denied'-Fehler in Ihrer Ausgabe vermeiden. Dies könnte jemandem helfen.

find / -type f -name "dein_muster" 2>/dev/null.

Wenn Sie einen anderen Befehl mit find verwenden, z.B. um die Größe von Dateien eines bestimmten Musters in einem Verzeichnis zu finden, würde 2>/dev/null immer noch funktionieren, wie unten gezeigt.

find . -type f -name "dein_muster" -exec du -ch {} + 2>/dev/null | grep total$.

Dies gibt die Gesamtgröße der Dateien eines bestimmten Musters zurück. Beachten Sie das 2>/dev/null am Ende des find-Befehls.

0 Stimmen

Schöne Bindung an das OS X! Jonathans Antwort erklärt den Teil 2>/dev/null. Kannst du bitte den Teil -exec du -ch {} + 2>/dev/null | grep total$ erklären.

1 Stimmen

@Masi Du kannst mit der Option -exec jeden Befehl verwenden, um weitere Aktionen auf den von find gefundenen Dateien oder Verzeichnissen auszuführen. du -ch Dateimuster berechnet die Größe jeder Datei, die dem Dateimuster entspricht, und die letzte Zeile dieser Ausgabe ist die Gesamtsumme aller Dateien, die dem Dateimuster entsprechen. Siehe die man page für du. grep total filtert nur die Zeile aus, die die Gesamtsumme extrahiert (die letzte Zeile).

13voto

viraptor Punkte 32254

Diese Fehlermeldungen werden an die Standardfehlerausgabe (fd 2) ausgegeben. Um sie zu filtern, leiten Sie einfach alle Fehlermeldungen in /dev/null um:

find . 2>/dev/null > some_file

oder verbinden Sie zuerst stderr und stdout und filtern dann diese spezifischen Fehler heraus:

find . 2>&1 | grep -v 'Permission denied' > some_file

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X