bash ubuntu - Wie kann ich alle "permission denied" Nachrichten von "find" ausschließen?




ignore errors (16)

Ich muss alle Nachrichten mit verweigerter Berechtigung ausblenden von:

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 in die Datei files_and_folders zu files_and_folders ?

Wie kann ich die Fehler gleichzeitig ausblenden?


Answers

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

find . 2>/dev/null >files_and_folders

Benutzen:

find . 2>/dev/null > files_and_folders

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

Wenn Sie wirklich andere mögliche Fehler, wie zu viele Hops auf einem Symlink, aber nicht die Erlaubnis verweigern wollen, dann müssen Sie wahrscheinlich eine fliegende Vermutung nehmen, dass Sie nicht viele Dateien haben, die 'Erlaubnis verweigert' genannt werden und versuche:

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

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

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

Die I / O-Umleitung im Befehl find lautet: 2>&1 > files_and_folders | . Die Pipe leitet die Standardausgabe an den Befehl grep um und wird zuerst angewendet. Die 2>&1 sendet den Standardfehler an die gleiche Stelle wie die Standardausgabe (die Pipe). Der > files_and_folders sendet eine Standardausgabe (aber keinen Standardfehler) an eine Datei. Das Endergebnis ist, dass Nachrichten, die in den Standardfehler geschrieben wurden, in der Pipe gesendet werden und die reguläre Ausgabe von find in die Datei geschrieben wird. Das grep filtert die Standardausgabe (Sie können entscheiden, wie selektiv sie sein soll, und muss möglicherweise die Schreibweise abhängig von Gebietsschema und O / S ändern), und das Finale >&2 bedeutet, dass die überlebenden Fehlermeldungen (auf Standardausgabe geschrieben) Gehe erneut zum Standardfehler. Die endgültige Umleitung könnte am Terminal als optional betrachtet werden, aber es wäre eine gute Idee, sie in einem Skript zu verwenden, so dass Fehlermeldungen im Standardfehler erscheinen.

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

Wenn Sie sich an die spezifische Version von find Sie auf Ihrem System haben, anpassen möchten, können alternative Optionen verfügbar sein. GNU find insbesondere eine Vielzahl von Optionen, die in anderen Versionen nicht verfügbar sind - siehe die derzeit akzeptierte Antwort für einen solchen Satz von Optionen.


Wenn Sie die Suche aus dem root "/" starten wollen, werden Sie wahrscheinlich Ausgaben sehen wie:

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 Befehl sudo find /. -name 'toBeSearched.file' verwenden: sudo find /. -name 'toBeSearched.file' sudo find /. -name 'toBeSearched.file' . Es fragt das Passwort des Super Users, wenn Sie das Passwort eingeben, sehen Sie das Ergebnis, was Sie wirklich wollen.

  2. Sie können die Standardfehlerausgabe von (Allgemeine Anzeige / Bildschirm) zu einer Datei umleiten und vermeiden, die Fehlermeldungen auf dem Bildschirm zu sehen! Umleitung zu einer speziellen Datei / dev / null:

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

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

Diese Fehler werden auf die Standardfehlerausgabe (fd 2) ausgegeben. Um sie herauszufiltern, leite einfach alle Fehler nach / dev / null um:

find . 2>/dev/null > some_file

oder erst verbinden stderr und stdout und dann diese spezifischen Fehler grep:

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


Benutzen:

find . ! -readable -prune -o -print

oder allgemeiner

find <paths> ! -readable -prune -o <other conditions like -name> -print
  • um "Erlaubnis verweigert" zu vermeiden
  • UND NICHT (andere) Fehlermeldungen unterdrücken
  • UND erhalten den Exit-Status 0 ("alle Dateien werden erfolgreich verarbeitet")

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

  • Der -readable Test entspricht lesbaren Dateien. Das ! Der Operator gibt true zurück, wenn der Test falsch ist. Und ! -readable ! -readable passt nicht lesbare Verzeichnisse (& Dateien).
  • Die Aktion -prune geht nicht in das Verzeichnis zurück.
  • ! -readable -prune ! -readable -prune kann übersetzt werden in: wenn das Verzeichnis nicht lesbar ist, nicht in es ! -readable -prune .
  • Der " -readable Test berücksichtigt Zugriffssteuerungslisten und andere Berechtigungsartefakte, die der -perm ignoriert.

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



Ich musste verwenden:

find / -name expect 2>/dev/null

Geben Sie den Namen des gesuchten Objekts an und weisen Sie ihn an, alle Fehler an / dev / null umzuleiten

erwarte, dass ich der Ort des erwarteten Programms bin, nach dem ich gesucht habe.


Sie können die grep -v invert-Übereinstimmung 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


- = Für MacOS = -

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

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

und im neuen Terminalfenster kannst du es nennen:

$ file=<filename or mask>; search

beispielsweise:

$ Datei = usw.; Suche


benutzen

sudo find / -name file.txt

Es ist dumm (weil Sie die Suche erhöhen) und nicht sicher, aber viel kürzer zum Schreiben.


Um nur die Warnungen zu verweigern, für die die Berechtigung verweigert wurde, informieren Sie find, die nicht lesbaren Dateien zu ignorieren, indem Sie sie aus der Suche entfernen. Fügen Sie Ihrer Suche einen Ausdruck als OR hinzu, z

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

Dies sagt meistens zu (mit einer nicht lesbaren Datei übereinstimmen und sie von der Liste entfernen ) ODER (einen Namen wie * .jbd anpassen und ihn [mit ls] anzeigen) . (Denken Sie daran, dass die Ausdrücke standardmäßig UND-verknüpft sind, wenn Sie -or nicht verwenden.) Sie müssen die Option -ls im zweiten Ausdruck verwenden. Andernfalls können Sie eine Standardaktion zum Anzeigen einer Übereinstimmung hinzufügen. Dadurch werden auch alle nicht lesbaren Dateien angezeigt .

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

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

Also (unlesbare Datei abgleichen und aus der Liste entfernen ) ODER (Pfad / dev und prune aus der Liste abgleichen ) ODER (Datei wie * .jbd abgleichen und anzeigen) .


Während die obigen Ansätze den Fall für Mac OS X nicht ansprechen, da Mac OS X keinen -readable Schalter unterstützt, können -readable auf diese Weise Fehler bei der 'Berechtigung verweigert' in Ihrer Ausgabe vermeiden. Dies könnte jemandem helfen.

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

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

find . -type f -name "your_pattern" -exec du -ch {} + 2>/dev/null | grep total$ 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 die 2>/dev/null am Ende des Suchbefehls.


Einfache Antwort:

find . > files_and_folders 2>&-

2>&- schließt ( - ) den Standard-Fehlerdateideskriptor ( 2 ), so dass alle Fehlermeldungen stummgeschaltet werden.

  • Der Beendigungscode ist immer noch 1 wenn sonst Fehler " Permission denied " gedruckt würde

Robuste Antwort für GNU find :

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

-prune zusätzliche Optionen, find das -prune zu find (verhindern Sie das Absteigen), aber - -print jedes Verzeichnis ( -type d ) aus, das (- \! ) -readable und -executable Berechtigungen hat oder -o -print andere Datei -print .

  • -readable und -executable options sind GNU-Erweiterungen, die nicht zum find
  • lxcfs bei nicht normalen / beschädigten Dateien immer noch ' Permission denied ' zurückgeben (siehe zB den Fehlerbericht , der Container-gemountete Dateisysteme mit lxcfs <v2.0.5 beeinflusst)

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

{ 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 Standardfehlerstream an grep , und entfernen Sie alle Zeilen, die 'Permission denied' Zeichenfolge 'Permission denied' .

LC_ALL=C setzt das POSIX-Gebietsschema mit einer Umgebungsvariablen , 3>&2 2>&1 1>&3 und 3>&2 2>&1 2>&- um den Standardfehler-Stream zu grep zu grep , und [ $? = 1 ] [ $? = 1 ] verwendet [] , um den von grep Fehlercode zu invertieren, um das ursprüngliche Verhalten von find zu approximieren.

  • Filtert auch alle 'Permission denied' Fehler aufgrund der Ausgabeumleitung (zB wenn die Datei ' files_and_folders selbst nicht beschreibbar ist)

Keine der obigen Antworten funktionierte für mich. Was ich im Internet finde, konzentriert sich auf: Fehler verstecken. None verarbeitet den Prozessrückgabecode / Exitcode ordnungsgemäß. Ich benutze Befehl find in bash-Skripten, um einige Verzeichnisse zu finden und dann ihren Inhalt zu inspizieren. Ich evaluiere den Befehl find success mit dem Exit-Code: ein Wert Null funktioniert, sonst scheitert es.

Die obige Antwort von funktioniert manchmal. Aber ich habe ein Szenario, in dem es scheitert! Ich habe das Problem entdeckt und es selbst behoben. Ich muss Dateien löschen, wenn:

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

Sehen Sie das Schlüsselproblem hier ist: UND / ODER. Eine gute vorgeschlagene Zustandssequenz, die ich lese, ist:

-type d ! -readable ! -executable -prune

Dies funktioniert nicht immer. Dies bedeutet, dass eine Bereinigung ausgelöst wird, wenn ein Match:

it is directory AND no read access AND no execute access

Diese Sequenz von Ausdrücken schlägt fehl, wenn der Lesezugriff gewährt wird, aber kein Ausführungszugriff besteht.

Nach einigen Tests habe ich das erkannt und meine Shell-Skript-Lö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 setzen:

has read access AND has execute access

Ansonsten hat es keinen vollen Zugriff, das heißt: es beschneiden. Dies erwies sich für mich in einem Szenario als erfolgreich, bei dem frühere Lösungsvorschläge fehlschlugen.

Ich biete unten technische Details für Fragen in den Kommentaren. Ich entschuldige mich, wenn die Details übertrieben sind.

  • ¿Warum mit Befehl nett? Ich habe die Idee here . Anfangs dachte ich, es wäre nett, die Prozesspriorität zu reduzieren, wenn man ein komplettes Dateisystem betrachtet. Ich erkannte, dass es für mich keinen Sinn ergibt, da mein Skript auf wenige Verzeichnisse beschränkt ist. Ich habe -max Tiefe bis 3 reduziert.
  • Warum suchen Sie in / home * /? Dies ist für diesen Thread nicht relevant. Ich installiere alle Anwendungen von Hand per Quellcode kompilieren mit nicht privilegierten Benutzern (nicht root). Sie sind in "/ home" installiert. Ich kann mehrere Binärdateien und Versionen haben, die zusammen leben. Ich muss alle Verzeichnisse lokalisieren, in einer Master-Slave-Art untersuchen und sichern. Ich kann mehr als ein "/ home" haben (mehrere Festplatten laufen auf einem dedizierten Server).
  • Warum benutzen Sie? Benutzer können symbolische Links zu Verzeichnissen erstellen. Es hängt von der Nützlichkeit ab, ich muss die gefundenen absoluten Pfade aufzeichnen.

POSIX

Zeilen in jeder Datei:

find . -name '*.php' -type f | xargs wc -l

Zeilen in jeder Datei, sortiert nach Dateipfad

find . -name '*.php' -type f | sort | xargs wc -l

Zeilen in jeder Datei, sortiert nach Anzahl der Zeilen, absteigend

find . -name '*.php' -type f | xargs wc -l | sort -nr

Gesamte Zeilen in allen Dateien

find . -name '*.php' -type f | xargs cat | wc -l




bash error-handling find file-permissions