it-swarm.com.de

Wie kann ich alle "Erlaubnis verweigert" -Meldungen von "Suchen" ausschließen?

Ich muss alle Berechtigungen verweigern Nachrichten vor:

find . > files_and_folders

Ich experimentiere, wenn eine solche Nachricht entsteht. Ich muss alle Ordner und Dateien sammeln, zu denen es nicht kommt. 

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

Wie kann ich die Fehler gleichzeitig ausblenden?

Benutzen:

find . 2>/dev/null > files_and_folders

Dies verbirgt natürlich nicht nur die Permission denied-Fehler, sondern alle Fehlermeldungen.

Wenn Sie wirklich andere mögliche Fehler beibehalten möchten, z. B. zu viele Hops auf einem Symlink, jedoch nicht die Berechtigung, die verweigert wurde, müssen Sie vermutlich die Vermutung aufgeben, dass Sie nicht viele Dateien mit der Bezeichnung 'Berechtigung verweigert' haben. und versuche:

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

Wenn Sie nur Standardfehler filtern möchten, können Sie die aufwendigere Konstruktion verwenden:

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

Die E/A-Umleitung im Befehl find lautet: 2>&1 > files_and_folders |. Die Pipe leitet die Standardausgabe an den Befehl grep um und wird zuerst angewendet. Der 2>&1 sendet den Standardfehler an dieselbe Stelle wie die Standardausgabe (die Pipe). Der > files_and_folders sendet die Standardausgabe (aber keinen Standardfehler) an eine Datei. Das Nettoergebnis ist, dass Nachrichten, die in Standardfehler geschrieben wurden, über die Pipe gesendet werden und die reguläre Ausgabe von find in die Datei geschrieben wird. Die Variable grep filtert die Standardausgabe (Sie können entscheiden, wie selektiv Sie sie festlegen möchten, und möglicherweise die Schreibweise in Abhängigkeit von Gebietsschema und O/S ändern muss). Das letzte Zeichen >&2 bedeutet, dass die verbleibenden Fehlermeldungen (in die Standardausgabe geschrieben) angezeigt werden noch einmal zum Standardfehler. Die endgültige Umleitung kann am Terminal als optional betrachtet werden, wäre jedoch eine sehr gute Idee, sie in einem Skript zu verwenden, damit Fehlermeldungen bei Standardfehlern angezeigt werden.

Es gibt unendlich viele Variationen zu diesem Thema, je nachdem, was Sie tun möchten. Dies funktioniert bei jeder Unix-Variante mit einem beliebigen Bourne-Shell-Derivat (Bash, Korn,…) und jeder POSIX-kompatiblen Version von find .

Wenn Sie sich an die spezifische Version von find anpassen möchten, die Sie in Ihrem System installiert haben, stehen möglicherweise alternative Optionen zur Verfügung. Insbesondere für GNU find gibt es eine Vielzahl von Optionen, die in anderen Versionen nicht verfügbar sind - siehe die derzeit akzeptierte Antwort für einen solchen Satz von Optionen.

517

Benutzen:

find . ! -readable -Prune -o -print

oder allgemeiner

find <paths> ! -readable -Prune -o <other conditions like -name> -print
  • "Erlaubnis verweigert" vermeiden 
  • UND unterdrücken Sie NICHT (andere) Fehlermeldungen
  • UND erhalte den Exit-Status 0 ("Alle Dateien werden erfolgreich verarbeitet")

Funktioniert mit: find (GNU findutils) 4.4.2 . Hintergrund:

  • Der -readable-Test entspricht lesbaren Dateien. Der !-Operator gibt true zurück, wenn test false ist. Und ! -readable stimmt mit nicht lesbaren Verzeichnissen (& Dateien) überein.
  • Die -Prune-Aktion steigt nicht in das Verzeichnis ab.
  • ! -readable -Prune kann übersetzt werden in: Wenn das Verzeichnis nicht lesbar ist, steigen Sie nicht hinein.
  • Der -readable-Test berücksichtigt Zugriffssteuerungslisten und andere Berechtigungsartefakte, die der -perm-Test ignoriert.

Siehe auch find (1) manpage für viele weitere Details.

261
Michael Brux

Wenn Sie die Suche von root "/" aus starten möchten, werden Sie wahrscheinlich folgende Ausgabe sehen:

find: /./proc/1731/fdinfo: Permission denied
find: /./proc/2032/task/2032/fd: Permission denied

Es ist wegen der Erlaubnis. Um das zu lösen:

  1. Sie können den Sudo-Befehl verwenden: Sudo find /. -name 'toBeSearched.file'. Es fragt das Superbenutzerpasswort. Wenn Sie das Passwort eingeben, wird das Ergebnis angezeigt, was Sie wirklich wollen.

  2. Sie können die Standardfehlerausgabe (in der Regel Anzeige/Bildschirm) in eine Datei umleiten und die Fehlermeldung auf dem Bildschirm vermeiden! Weiterleitung in eine spezielle Datei/dev/null:

    find /. -name 'toBeSearched.file' 2>/dev/null
    
  3. Sie können die Standardfehlerausgabe von (im Allgemeinen Anzeige/Bildschirm) zur Standardausgabe (im Allgemeinen Anzeige/Bildschirm) umleiten und dann mit dem Befehl "grep" mit dem Parameter -v "invert" umleiten, um die Ausgabezeilen nicht zu sehen, deren Berechtigung verweigert wurde Wortpaare:

    find /. -name 'toBeSearched.file' 2>&1 | grep -v 'Permission denied'
    
107
Fatih Aksu

Ich musste verwenden:

find / -name expect 2>/dev/null

geben Sie den Namen des gesuchten Objekts an und sagen Sie es anschließend, um alle Fehler nach/dev/null umzuleiten

erwarten Sie den Ort des erwarteten Programms, nach dem ich gesucht habe.

86
Jeremy

Pipe stderr an /dev/null mit 2>/dev/null

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

52
Matt

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" -Druckanweisungen aus dem Suchprogramm? - Unix & Linux Stack Exchange )

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

Standardfehler umleiten Wenn Sie beispielsweise bash auf einem Unix-Computer verwenden, können Sie den Standardfehler wie folgt auf/dev/null umleiten:

find . 2>/dev/null >files_and_folders
23
Jason Coco

Obige Ansätze behandeln den Fall für Mac OS X nicht, da Mac Os X -readable switch nicht unterstützt. Auf diese Weise können Sie "Permission Denied" -Fehler in Ihrer Ausgabe vermeiden. Das könnte jemandem helfen.

find / -type f -name "your_pattern" 2>/dev/null

Wenn Sie einen anderen Befehl mit find verwenden, um beispielsweise die Größe von Dateien eines bestimmten Musters in einem Verzeichnis zu ermitteln, funktioniert 2>/dev/null weiterhin wie unten gezeigt.

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

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

19
Bunti

Diese Fehler werden in der Standardfehlerausgabe (fd 2) ausgedruckt. Um sie herauszufiltern, leiten Sie einfach alle Fehler nach/dev/null um:

find . 2>/dev/null > some_file

oder füge erst stderr und stdout hinzu und greife dann diese spezifischen Fehler aus:

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

Einfache antwort:

find . > files_and_folders 2>&-

2>&- schließt (-) Den Standard-Fehlerdateideskriptor (2), Sodass alle Fehlermeldungen stummgeschaltet werden .

  • Der Beendigungscode lautet weiterhin 1, Wenn andernfalls Fehler mit dem Wert "Permission denied" Ausgegeben würden

Robuste Antwort für GNU find:

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

Übergebe zusätzliche Optionen an find, die -Prune (Abstieg verhindern), aber trotzdem -print jedes Verzeichnis ( -typed), das nicht beide hat ( \! ) -readable und -executable Berechtigungen oder ( -o ) -print Jede andere Datei .

  • -readable und -executable Optionen sind GNU Erweiterungen, nicht Teil des POSIX!) Standard
  • Kann bei abnormalen/beschädigten Dateien immer noch 'Permission denied' Zurückgeben (siehe z. B. Fehlerbericht bei Container-Dateisystemen mit lxcfs <v2.0.5)

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

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

Verwenden Sie eine Pipeline , um den Standardfehlerstrom an grep zu übergeben, und entfernen Sie alle Zeilen, die den 'Permission denied' string.

LC_ALL=C Setzt das POSIX-Gebietsschema unter Verwendung einer mgebungsvariablen , 3>&2 2>&1 1>&3 Und 3>&2 2>&1doppelte Dateideskriptoren um den Standardfehlerstrom an grep weiterzuleiten, und [ $? = 1 ] verwendet [] um das umzukehren Fehlercode, der von grep zurückgegeben wird, um das ursprüngliche Verhalten von find zu approximieren.

  • Filtert auch alle 'Permission denied' - Fehler aufgrund der Ausgabeumleitung (z. B. wenn die files_and_folders - Datei selbst nicht beschreibbar ist).
10
wjordan

Um zu vermeiden, dass nur die Berechtigung verweigert wird, weisen Sie find die unlesbaren Dateien zu, indem Sie sie aus der Suche entfernen. Fügen Sie einen Ausdruck als OR zu Ihrer Suche hinzu, z. B.

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

Dies besagt meistens (Übereinstimmung mit einer nicht lesbaren Datei und Beschneiden aus der Liste) OR (Übereinstimmung mit einem Namen wie * .jbd und Anzeige [mit ls]). (Denken Sie daran, dass die Ausdrücke standardmäßig AND-verknüpft sind, es sei denn, Sie verwenden -or.) Sie benötigen die Option -ls im zweiten Ausdruck, andernfalls kann find eine Standardaktion hinzufügen, um eine Übereinstimmung anzuzeigen, die auch alle unlesbaren Dateien anzeigt .

Wenn Sie jedoch nach echten Dateien auf Ihrem System suchen, besteht normalerweise kein Grund, nach/dev zu suchen, das viele Dateien enthält. Daher sollten Sie einen Ausdruck hinzufügen, der dieses Verzeichnis ausschließt, z. B .:

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

Also (Nicht lesbare Datei und Liste aus Liste löschen) OR (Übereinstimmungspfad/dev und Prune aus Liste) OR (Übereinstimmungsdatei wie * .jbd und es anzeigen).

4
simpleuser

benutzen

Sudo find / -name file.txt

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

4
mist

Keine der obigen Antworten funktionierte für mich. Was immer ich im Internet finde, konzentriert sich auf: Fehler ausblenden. Keiner verarbeitet den Rückgabecode/Exitcode des Prozesses ordnungsgemäß. Ich verwende den Befehl find in den Bash-Skripts, um einige Verzeichnisse zu finden und deren Inhalt zu überprüfen. Ich evaluiere den Befehl find success mithilfe des Exit-Codes: Ein Wert Null funktioniert, andernfalls schlägt der Befehl fehl.

Die obige Antwort von Michael Brux funktioniert manchmal. Aber ich habe ein Szenario, in dem es versagt! Ich habe das Problem entdeckt und es selbst behoben. Ich muss Dateien beschneiden, wenn:

it is a directory AND has no read access AND/OR has no execute access

Das Schlüsselproblem hier ist: UND/ODER. Eine gute vorgeschlagene Zustandssequenz, die ich las, ist:

-type d ! -readable ! -executable -Prune

Das funktioniert nicht immer. Dies bedeutet, dass eine Prune ausgelöst wird, wenn eine Übereinstimmung besteht:

it is directory AND no read access AND no execute access

Diese Folge von Ausdrücken schlägt fehl, wenn Lesezugriff gewährt wird, jedoch kein Ausführungszugriff.

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

Nizza find/home */-maxdepth 5 -follow \
(-typ d -a !\(-readable -a -executable \) \) -Pflaume \
-o \
\(-type -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:

has read access AND has execute access

Ansonsten hat es keinen vollständigen Zugriff, was bedeutet: Beschneiden Sie es. Dies hat sich in einem Szenario bewährt, bei dem die vorherigen Lösungsvorschläge fehlgeschlagen sind.

Im Folgenden werden technische Details für Fragen im Kommentarbereich angegeben. Ich entschuldige mich, wenn Details zu groß sind. 

  • Warum ist der Befehl nett? Ich hatte die Idee hier . Anfangs dachte ich, es wäre schön, die Prozesspriorität zu reduzieren, wenn man ein gesamtes Dateisystem betrachtet. Mir wurde klar, 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 per Handcode und kompiliere sie mit nicht privilegierten Benutzern (nicht root). Sie werden in "/ home" installiert. Ich kann mehrere Binärdateien und Versionen zusammenleben. Ich muss alle Verzeichnisse lokalisieren, inspizieren und in einer Master-Slave-Methode sichern. Ich kann mehr als ein "/ home" haben (mehrere Laufwerke laufen auf einem dedizierten Server). 
  • Warum sollten Sie -follow verwenden? Benutzer können symbolische Links zu Verzeichnissen erstellen. Die Nützlichkeit hängt davon ab, ich muss die gefundenen absoluten Pfade aufzeichnen.
2
Jordi Ferran

Sie können den grep -v invert-match verwenden

-v, --invert-match        select non-matching lines

so was:

find . > files_and_folders
cat files_and_folders | grep -v "permission denied" > files_and_folders

Sollte zur Magie

2

- = Für MacOS = -

Erstellen Sie einen neuen Befehl mit Alias: Fügen Sie einfach die Zeile ~/.bash_profile hinzu:

alias search='find / -name $file 2>/dev/null'

und in einem neuen Terminalfenster können Sie es anrufen:

$ file=<filename or mask>; search

zum Beispiel:

$ file = etc; Suche

1
Jan aka uptech

Wenn Sie CSH oder TCSH verwenden, finden Sie hier eine Lösung: 

( find . > files_and_folders ) >& /dev/null

Wenn Sie eine Ausgabe an das Terminal wünschen:

( find . > /dev/tty ) >& /dev/null

Wie jedoch "csh-whynot" FAQ beschreibt, sollten Sie CSH nicht verwenden.

0
Kayle Sawyer