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.

13voto

wjordan Punkte 18512

Einfache Antwort:

find . > files_and_folders 2>&-

_2>&- schließt (-) den Standardfehler-Dateideskriptor (2), sodass alle Fehlermeldungen stummgeschaltet werden._

  • Der Exit-Code wird immer noch 1 sein, wenn irgendwelche 'Zugriff verweigert' Fehler ausgegeben werden würden

Robuste Antwort für GNU find:

find . -type d \! \( -readable -executable \) -prune -print -o -print > files_and_folders

_Übergeben Sie zusätzliche Optionen an find das -prune (Verhindern des Abstiegs in) aber dennoch -print jedes Verzeichnis (-typed), das nicht (\!) sowohl Lese- als auch Ausführungsberechtigungen hat, oder (-o) -print jede andere Datei._

  • -readable und -executable Optionen sind GNU-Erweiterungen und gehören nicht zum POSIX-Standard
  • Kann weiterhin 'Zugriff verweigert' bei abnormen/beschädigten Dateien zurückgeben (z.B. siehe Fehlerbericht, der Container-mountierte Dateisysteme betrifft, die lxcfs < v2.0.5 verwenden)

Robuste Antwort, die mit jedem POSIX-kompatiblen find funktioniert (GNU, OSX/BSD, usw.)

{ LC_ALL=C find . 3>&2 2>&1 1>&3 > files_and_folders | grep -v 'Permission denied'; [ $? = 1 ]; } 3>&2 2>&1

_Verwenden Sie einen Pipe, um den Standardfehlerstrom an grep zu übergeben, und entfernen Sie alle Zeilen, die den String 'Permission denied' enthalten._

_LC_ALL=C setzt die POSIX-Lokale unter Verwendung einer Umgebungsvariable, 3>&2 2>&1 1>&3 und 3>&2 2>&1 duplizieren Dateideskriptoren, um den Standardfehlerstrom an grep zu leiten, und [ $? = 1 ] verwendet [] um den Fehlercode, der von grep zurückgegeben wird, umzukehren, um das ursprüngliche Verhalten von find zu approximieren._

  • Filtert auch alle 'Zugriff verweigert' Fehler aufgrund von Ausgaberichtlinien (z.B. wenn die Datei files_and_folders selbst nicht beschreibbar ist)

0 Stimmen

Wie denken Sie über den Antwortvorschlag von JordiFerran? - - Können Sie Ihre Antwort damit vergleichen?

2 Stimmen

Die angegebene Befehlsshell dieses Antwort ist nicht allgemein verwendbar (listet nur Verzeichnisse auf, die ${m_find_name} entsprechen) und enthält mehrere Optionen, die für die Frage irrelevant sind (nice, /home*, -maxdepth 5, -folgen). Diese Antwort behandelt das spezifische Problem "Filtern von lesbaren, aber nicht ausführbaren Verzeichnissen" prägnanter, bleibt jedoch allgemein verwendbar.

1 Stimmen

@wjordan: Danke. Ich habe meine Kommentare entfernt, aber ein Punkt trifft immer noch zu: Die auf -perm basierende Lösung ist es nicht wert, präsentiert zu werden, weil sie mehr grundlegend etwas anderes tut als beabsichtigt: Es ist ein rein Datei-zentrierter Test, der sich auf den Datei-Besitzer und die Gruppe bezieht, von denen keiner eine garantierte Beziehung zum Benutzer hat, der den Befehl aufruft (siehe diese Antwort von mir). Es scheint, als würde deine überarbeitete GNU-Lösung jetzt Fehler bei der Berechtigungsverweigerung von Dateien nicht mehr abfangen.

4voto

simpleuser Punkte 1479

Um die Warnungen für Berechtigungsverweigerungen zu vermeiden, teilen Sie find mit, dass es die nicht lesbaren Dateien ignorieren soll, indem Sie sie aus der Suche ausschließen. Fügen Sie einen Ausdruck als ODER zu Ihrem find-Befehl hinzu, zum Beispiel

find / \! -readable -prune -o -name '*.jbd' -ls

Dies sagt größtenteils aus, dass (eine nicht lesbare Datei gefunden und aus der Liste ausgenommen wird) ODER (einen Namen wie *.jbd finden und anzeigen [mit ls]). (Denken Sie daran, dass die Ausdrücke standardmäßig UND-verknüpft sind, es sei denn, Sie verwenden -or.) Sie benötigen das -ls im zweiten Ausdruck, sonst könnte find eine Standardaktion hinzufügen, um eines der beiden Ergebnisse anzuzeigen, was auch alle nicht lesbaren Dateien anzeigen würde.

Aber wenn Sie echte Dateien auf Ihrem System suchen, gibt es normalerweise keinen Grund, in /dev zu suchen, da es viele Dateien enthält. Daher sollten Sie einen Ausdruck hinzufügen, der dieses Verzeichnis ausschließt, wie zum Beispiel:

find / -mount \! -readable -prune  -o  -path /dev -prune  -o  -name '*.jbd' -ls

Also (nicht lesbare Datei finden und aus der Liste ausnehmen) ODER (Pfad /dev finden und aus der Liste ausnehmen) ODER (Datei wie *.jbd finden und anzeigen).

4voto

user1735921 Punkte 1328

Verwenden Sie dies einfach, um nach einer Datei in Ihrem System zu suchen.

find / -name DEIN_SUCHBEGRIFF 2>&1 | grep DEIN_SUCHBEGRIFF

Lassen Sie uns keine unnötige Überentwicklung betreiben, Sie möchten doch nur nach Ihrer Datei suchen, oder? Dann ist dies der Befehl, der Ihnen die Dateien auflistet, wenn sie in einem für Sie zugänglichen Bereich vorhanden sind.

3voto

mist Punkte 1853

Verwenden

sudo find / -name file.txt

Es ist dumm (weil du die Suche erhöhst) und unsicher, aber viel kürzer zu schreiben.

0 Stimmen

Sie durchsuchen hier das gesamte Dateisystem, so dass Sie dies als "Aufsuchen" bezeichnen. Warum nennen Sie es unsicher? Weil es das gesamte Dateisystem durchsuchen soll?

2 Stimmen

Da sudo den find Befehl mit Root-Berechtigungen ausführt, was grundsätzlich keine gute Idee ist. Die Prinzipien der Segregation und des geringsten Privilegs werden verletzt.

4 Stimmen

Die "Elevation" hier betrifft die Berechtigungen, zu root, mit sudo. Du riskierst, dass dein ganzes System durch einen Fehler in find oder eine bösartige Version durcheinandergebracht wird, oder durch eine falsche Anforderung, die unerwartet etwas schreibt, was nicht passieren könnte, wenn du dies mit normalen Berechtigungen ausgeführt hättest.

3voto

Jordi Ferran Punkte 129

Keine der obigen Antworten hat für mich funktioniert. Alles, was ich im Internet finde, konzentriert sich darauf: Fehler ausblenden. Keiner behandelt den Prozessrückgabecode / Exit-Code richtig. Ich verwende den Befehl find in Bash-Skripten, um bestimmte Verzeichnisse zu lokalisieren und ihren Inhalt zu inspizieren. Ich bewerte den Erfolg des Befehls find anhand des Exit-Codes: ein Wert null funktioniert, ansonsten schlägt es fehl.

Die oben bereitgestellte Antwort von Michael Brux funktioniert manchmal. Aber in einem Szenario versagt sie! Ich habe das Problem entdeckt und selbst behoben. Ich muss Dateien ausschließen, wenn:

es sich um ein Verzeichnis handelt UND kein Lesezugriff vorhanden ist UND/ODER kein Ausführungszugriff vorhanden ist

Das Hauptproblem hier ist: UND/ODER. Eine gute vorgeschlagene Bedingungssequenz, die ich gelesen habe, ist:

-type d ! -readable ! -executable -prune

Dies funktioniert nicht immer. Das bedeutet, dass ein Ausschluss ausgelöst wird, wenn eine Übereinstimmung vorliegt:

es handelt sich um ein Verzeichnis UND kein Lesezugriff UND kein Ausführungszugriff

Diese Sequenz von Ausdrücken versagt, wenn der Lesezugriff gewährt wird, jedoch kein Ausführungszugriff vorhanden ist.

Nach einigen Tests habe ich das erkannt und meine Shell-Skriptlösung geändert in:

nice find /home*/ -maxdepth 5 -follow \
    \( -type d -a ! \( -readable -a -executable \) \) -prune \
    -o \
    \( -type d -a -readable -a -executable -a -name "${m_find_name}" \) -print

Der Schlüssel hier ist, das "nicht wahr" für einen kombinierten Ausdruck zu platzieren:

hat Lesezugriff UND hat Ausführungszugriff

Andernfalls hat es keinen vollen Zugriff, was bedeutet: es ausschließen. Dies hat sich für mich in einem Szenario bewährt, in dem vorherige vorgeschlagene Lösungen versagten.

Ich liefere unten technische Details für Fragen im Kommentarbereich. Es tut mir leid, wenn die Details übermäßig sind.

  • Warum den Befehl nice verwenden? Ich habe die Idee hier bekommen. Zunächst dachte ich, es wäre angenehm, die Prozesspriorität zu reduzieren, wenn ich ein ganzes Dateisystem durchsuche. Ich habe festgestellt, dass es für mich keinen Sinn macht, da mein Skript auf wenige Verzeichnisse beschränkt ist. Ich habe -maxdepth auf 3 reduziert.
  • Warum innerhalb von /home* suchen? Dies ist für diesen Thread nicht relevant. Ich installiere alle Anwendungen manuell durch das Kompilieren des Quellcodes mit nicht privilegierten Benutzern (nicht root). Sie sind innerhalb von "/home" installiert. Ich kann mehrere Binärdateien und Versionen zusammen installiert haben. Ich muss alle Verzeichnisse lokalisieren, inspizieren und auf Master-Slave-Weise sichern. Ich kann mehr als ein "/home" haben (mehrere Laufwerke innerhalb eines dedizierten Servers).
  • Warum -follow verwenden? Benutzer könnten symbolische Links zu Verzeichnissen erstellen. Der Nutzen hängt davon ab, ich muss die absoluten Pfade der gefundenen Pfade festhalten.

0 Stimmen

Vielen Dank für Ihre Antwort und die netten Beobachtungen! Ich habe hier ein Kopfgeld eröffnet, um Ihre Antwort besser anzuzeigen. Ich denke, es ist eine schöne Entdeckung, keinen Lese- und Ausführungszugriff zu verhindern. - - Können Sie bitte erklären, warum Sie nice und find $HOME -maxdepth 5 -follow ... verwenden?

2 Stimmen

Der Shell-Skript, wie angegeben, ist nicht allgemein verwendbar (listet nur Verzeichnisse auf, die mit ${m_find_name} übereinstimmen) und enthält mehrere Optionen, die für die Frage nicht relevant sind (nice, /home*, -maxdepth 5, -follow). Ich habe eine Antwort hinzugefügt, die das spezifische Problem des 'Filterns lesbarer, aber nicht ausführbarer Verzeichnisse' präziser behandelt, dabei aber allgemein verwendbar bleibt.

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