Hinweis:
* Diese Antwort geht wahrscheinlich tiefer als der Anwendungsfall es rechtfertigt und find 2>/dev/null
kann in vielen Situationen gut genug sein. Es kann weiterhin für eine plattformübergreifende Perspektive und für die Erörterung einiger fortschrittlicher Shell-Techniken von Interesse sein, um eine möglichst robuste Lösung zu finden, auch wenn die vorgeschützten Fälle weitgehend hypothetisch sind.
* Wenn Ihr System so konfiguriert ist, dass lokalisierte Fehlermeldungen angezeigt werden , stellen Sie den folgenden find
Aufrufen LC_ALL=C
( LC_ALL=C find ...
) voran, um sicherzustellen, dass englische Nachrichten gemeldet werden, damit dies grep -v 'Permission denied'
wie beabsichtigt funktioniert. Unweigerlich jedoch keine Fehlermeldungen , die Sie angezeigt bekommen dann auch in englischer Sprache.
Wenn Ihre Shell bash
oder istzsh
, gibt es eine Lösung, die robust und relativ einfach ist und nur POSIX-kompatible find
Funktionen verwendet . während bash
sich die nicht Teil von POSIX, die meisten modernen Unix - Plattformen kommen mit ihm ist, so dass diese Lösung weit tragbar:
find . > files_and_folders 2> >(grep -v 'Permission denied' >&2)
Hinweis: Es besteht eine geringe Wahrscheinlichkeit, dass ein Teil der grep
Ausgabe nach find
Abschluss eintrifft , da der Gesamtbefehl nicht darauf wartet, dass der Befehl im Inneren >(...)
beendet wird. In bash
können Sie dies verhindern, indem Sie | cat
an den Befehl anhängen .
>(...)
ist eine (selten eingesetzt) Ausgabeprozess Substitution , die ausgegeben (in diesem Fall Umleiten erlaubt Stderr Ausgang ( 2>
) an die stdin des Innenbefehls >(...)
.
Neben bash
und zsh
, ksh
sich unterstützt , als auch im Prinzip , sondern zu versuchen , sie mit Umleitung zu kombinieren aus stderr2> >(...)
scheint , wie hier ( ) gemacht, stillschweigend ignoriert zu werden (in ksh 93u+
).
grep -v 'Permission denied'
filtert aus ( -v
) alle Zeilen (aus dem find
Stderr Strom Befehl), die die Phrase enthalten , Permission denied
und gibt die verbleibenden Zeilen zu Stderr ( >&2
).
Dieser Ansatz ist:
robust : grep
Wird nur auf Fehlermeldungen angewendet (und nicht auf eine Kombination aus Dateipfaden und Fehlermeldungen, die möglicherweise zu Fehlalarmen führen), und andere Fehlermeldungen als die mit Berechtigungen verweigerten werden an stderr weitergeleitet.
Nebenwirkungsfrei : find
Der Exit-Code bleibt erhalten: Die Unfähigkeit, auf mindestens eines der gefundenen Dateisystemelemente zuzugreifen, führt zu einem Exit-Code 1
(obwohl dies Ihnen nicht sagt, ob (auch) andere Fehler als die mit Berechtigung verweigerten aufgetreten sind).
POSIX-konforme Lösungen:
Vollständig POSIX-kompatible Lösungen weisen entweder Einschränkungen auf oder erfordern zusätzliche Arbeit.
Wenn find
die Ausgabe ohnehin in einer Datei erfasst (oder ganz unterdrückt) werden soll, ist die Pipeline-basierte Lösung aus Jonathan Lefflers Antwort einfach, robust und POSIX-konform:
find . 2>&1 >files_and_folders | grep -v 'Permission denied' >&2
Beachten Sie, dass die Reihenfolge der Weiterleitungen wichtig ist: 2>&1
muss an erster Stelle stehen .
Stdout Ausgang Einfangen in einer Datei vorne ermöglicht 2>&1
sendet nur Fehlermeldungen , durch die Pipeline, die grep
dann auf eindeutig arbeiten.
Das ist einzige Nachteil , dass der gesamte Code Ausgang wird das sein grep
Gebot , nicht find
‚s, was in diesem Fall bedeutet: Wenn es keine Fehler bei allen oder nur die Erlaubnis verweigert Fehler, wird der Exit - Code werden (Meldeausfall1
), andernfalls ( andere Fehler als die, denen die Erlaubnis verweigert wurde) - das ist das Gegenteil der Absicht. Der Exit-Code wird jedoch ohnehin selten verwendet , da er häufig nur wenige Informationen über grundlegende Fehler wie das Übergeben eines nicht vorhandenen Pfads hinaus übermittelt .
Allerdings ist der konkrete Fall auch nur einiger0
find
der Eingangswege aufgrund von Berechtigungen Mangel unzugänglich sein wird in reflektiert find
‚s Exit - Code (in beiden GNU und BSD , find
wenn ein Berechtigungs verweigert Fehler tritt für:) jede der Dateien verarbeitet, der Exit - Code wird auf 1
.
Die folgende Variante spricht das an:
find . 2>&1 >files_and_folders | { grep -v 'Permission denied' >&2; [ $? -eq 1 ]; }
Der Exit-Code gibt nun an, ob andere als die Permission denied
aufgetretenen Fehler aufgetreten sind. 1
Wenn ja, 0
andernfalls.
Mit anderen Worten: Der Exit-Code spiegelt jetzt die wahre Absicht des Befehls wider: success ( 0
) wird gemeldet, wenn überhaupt keine Fehler aufgetreten sind oder nur Fehler ohne Berechtigung aufgetreten sind.
Dies ist wohl sogar besser, als nur find
den Exit-Code durchzuleiten, wie in der Lösung oben.
gniourf_gniourf in den Kommentaren schlägt eine (immer noch POSIX-kompatible) Verallgemeinerung dieser Lösung unter Verwendung ausgefeilter Umleitungen vor , die auch mit dem Standardverhalten des Druckens der Dateipfade nach stdout funktioniert :
{ find . 3>&2 2>&1 1>&3 | grep -v 'Permission denied' >&3; } 3>&2 2>&1
Kurz gesagt: Descriptor Benutzerdefinierte Datei 3
wird temporär Swap stdout (gebraucht 1
) und stderr ( 2
), so dass Fehlermeldungen allein zu geleitet werden kann grep
via stdout.
Ohne diese Umleitungen würden sowohl Daten (Dateipfade) als auch Fehlermeldungen grep
über stdout weitergeleitet und grep
könnten dann nicht zwischen Fehlermeldungen Permission denied
und einer (hypothetischen) Datei unterscheiden, deren Name zufällig die Phrase enthält Permission denied
.
Wie in der ersten Lösung lautet der gemeldete Exit-Code jedoch grep
's, nicht find
' s, sondern es kann der gleiche Fix wie oben angewendet werden.
Anmerkungen zu den vorhandenen Antworten:
Es gibt mehrere Punkte beachten Michael Brux Antwort , find . ! -readable -prune -o -print
:
Es erfordert GNU find
; Insbesondere wird es unter MacOS nicht funktionieren. Wenn Sie den Befehl nur für die Arbeit mit GNU benötigen find
, ist dies natürlich kein Problem für Sie.
Einige Permission denied
Fehler können weiterhin auftreten : find ! -readable -prune
Meldet solche Fehler für die untergeordneten Elemente von Verzeichnissen, für die der aktuelle Benutzer zwar über die r
Berechtigung verfügt, jedoch keine x
(ausführbare) Berechtigung besitzt. Der Grund dafür ist , dass , weil das Verzeichnis selbst ist lesbar, -prune
wird nicht ausgeführt, und der Versuch, absteigen in das Verzeichnis löst dann die Fehlermeldungen. Der typische Fall ist jedoch, dass die r
Erlaubnis fehlt.
Hinweis: Der folgende Punkt ist eine Frage der Philosophie und / oder des spezifischen Anwendungsfalls. Sie können entscheiden, dass er für Sie nicht relevant ist und dass der Befehl Ihren Anforderungen gut entspricht, insbesondere wenn Sie nur die Pfade drucken :
- Wenn Sie das Filtern der Fehlermeldungen mit verweigerter Berechtigung als separate Aufgabe konzipieren, die Sie auf jeden
find
Befehl anwenden möchten, erfordert der umgekehrte Ansatz, Fehler mit verweigerter Berechtigung proaktiv zu verhindern, das Einfügen von "Rauschen" in den find
Befehl, der ebenfalls eingeführt wird Komplexität und logische Fallstricke .
- Zum Beispiel, die meist up-gestimmt Kommentar auf Michaels Antwort (zum Zeitpunkt des Schreibens) versucht zu zeigen , wie zu erweitern den Befehl durch einen mit
-name
Filter wie folgt:
find . ! -readable -prune -o -name '*.txt'
Dies ist jedoch funktioniert nicht wie vorgesehen, weil die hintere -print
Aktion erforderlich (Eine Erklärung finden Sie in dieser Antwort ). Solche Feinheiten können Fehler verursachen.
Die erste Lösung in Jonathan Leffler Antwort , find . 2>/dev/null > files_and_folders
wie er selbst sagt, zum Schweigen bringt blind alle Fehlermeldungen (und die Abhilfe ist umständlich und nicht ganz robust, wie er erklärt auch). Pragmatisch gesehen ist dies jedoch die einfachste Lösung , da Sie möglicherweise davon ausgehen können, dass alle Fehler mit der Berechtigung zusammenhängen.
Nebel Antwort , sudo find . > files_and_folders
, ist prägnant und pragmatisch, aber schlecht beraten für etwas anderes als nur das Drucken von Dateinamen , aus Sicherheitsgründen: weil Sie als laufen root Benutzer „ , riskieren Sie Ihr gesamtes System mit durch einen Fehler in Fund werden verkorkste oder eine böswillige Version oder ein falscher Aufruf, der etwas Unerwartetes schreibt, was nicht passieren könnte, wenn Sie dies mit normalen Berechtigungen ausführen "(aus einem Kommentar zur Antwort von Mist durch Tripleee ).
Die zweite Lösung in viraptor Antwort , find . 2>&1 | grep -v 'Permission denied' > some_file
läuft das Risiko von Fehlalarmen (durch eine Mischung aus stdout und stderr durch die Pipeline zu senden), und möglicherweise anstelle der Berichterstattung nicht -permission verweigern Fehler über stderr, erfasst sie neben den Ausgangspfaden in der Ausgabedatei.
find . 2>&1 > files_and_folders | grep -v 'Permission denied' >&2
?{ find . 3>&2 2>&1 1>&3 | grep -v 'Permission denied' >&3; } 3>&2 2>&1
>(...)
sind Bash-spezifisch.find
hervorgehoben und beworben werden sollte:find
Der Exit-Code von ist notorisch nutzlos. Hier wird es sehr wahrscheinlich ungleich Null sein (und das nutzlos).execute/search
Dateimodus-Berechtigung, um ein Verzeichnis zu durchsuchen (die Inodes der enthaltenen Dateien abzurufen).find
Dies geschieht, um in ein Unterverzeichnis abzusteigen (zusätzlich zurread
Berechtigung zum Auflisten der Dateien in einem Verzeichnis). Dies ist kein "Fehler" oder "Portierungsfehler".Verwenden:
Dies verbirgt
Permission denied
natürlich nicht nur die Fehler, sondern alle Fehlermeldungen.Wenn Sie wirklich andere mögliche Fehler behalten möchten, z. B. zu viele Hops auf einem Symlink, aber nicht die verweigerten, dann müssen Sie wahrscheinlich davon ausgehen, dass Sie nicht viele Dateien mit dem Namen "Berechtigung verweigert" haben. und versuche:
Wenn Sie nur Standardfehler filtern möchten, können Sie die aufwändigere Konstruktion verwenden:
Die E / A-Umleitung des
find
Befehls lautet :2>&1 > files_and_folders |
. Die Pipe leitet die Standardausgabe an dengrep
Befehl weiter und wird zuerst angewendet. Der2>&1
sendet den Standardfehler an dieselbe Stelle wie die Standardausgabe (die Pipe). Das> files_and_folders
sendet die Standardausgabe (aber nicht den Standardfehler) an eine Datei. Das Nettoergebnis ist, dass Nachrichten, die auf Standardfehler geschrieben wurden, über die Pipe gesendet werden und die reguläre Ausgabe vonfind
in die Datei geschrieben wird. Dasgrep
filtert die Standardausgabe (Sie können entscheiden, wie selektiv sie sein soll, und muss möglicherweise die Schreibweise je nach Gebietsschema und Betriebssystem ändern) und das Finale>&2
bedeutet, dass die überlebenden Fehlermeldungen (in die Standardausgabe geschrieben) erneut zum Standardfehler gehen. Die endgültige Umleitung kann am Terminal als optional angesehen werden, wäre jedoch eine sehr gute Idee, sie in einem Skript zu verwenden, damit bei Standardfehlern Fehlermeldungen angezeigt werden.Es gibt endlose Variationen zu diesem Thema, je nachdem, was Sie tun möchten. Dies funktioniert auf jeder Unix-Variante mit jedem Bourne-Shell-Derivat (Bash, Korn,…) und jeder POSIX-kompatiblen Version von
find
.Wenn Sie sich an die spezifische Version
find
Ihres Systems anpassen möchten , stehen möglicherweise alternative Optionen zur Verfügung.find
Insbesondere GNU verfügt über eine Vielzahl von Optionen, die in anderen Versionen nicht verfügbar sind. Eine solche Option finden Sie in der derzeit akzeptierten Antwort.quelle
2>/dev/null
, ohne Platz!2>
ist eine einzelne Einheit ohne Leerzeichen; Sie können ein Leerzeichen zwischen dem Dateinamen und dem Dateinamen einfügen. Ähnlich verhält es sich mit anderen Umleitungen, z. B.2>&1
(die den Standardfehler an dieselbe Stelle umleiten wie die Standardausgabe) oder2>&-
die den Standardfehler schließen usw. Weitere Informationen finden Sie unter Umleitungen . (Der obige Code ist eine generische POSIX-ähnliche Shell, nicht spezifisch fürbash
.)Verwenden:
oder allgemeiner
Funktioniert mit: find (GNU findutils) 4.4.2. Hintergrund:
-readable
Test stimmt mit lesbaren Dateien überein. Der!
Operator gibt true zurück, wenn test false ist. Und! -readable
stimmt mit nicht lesbaren Verzeichnissen (& Dateien) überein.-prune
Aktion wird nicht in ein Verzeichnis verschoben.! -readable -prune
kann übersetzt werden in: Wenn das Verzeichnis nicht lesbar ist, steigen Sie nicht in das Verzeichnis ab.-readable
Test berücksichtigt Zugriffssteuerungslisten und andere Berechtigungsartefakte, die der-perm
Test ignoriert.Siehe auch
find
(1) Manpage für viele weitere Details.quelle
-o
:find . ! -readable -prune -o -name '*.txt'
find
nicht-readable
als Option enthalten ist. Das gilt auch nichtfind
für BSD und damit für Mac OS X (bei anderen Systemen bin ich mir nicht sicher).find
Wenn Sie also GNU garantiert haben, funktioniert dies hervorragend, aber es ist nicht offensichtlich, wie Sie dies anpassen können, wenn Sie nicht garantieren können, dass auf dem System GNUfind
installiert ist. (Es wird gut unter Linux funktionieren; es kann anderswo funktionieren oder nicht.)find . ! -readable -prune -o -name '*.txt'
scheint unter Ubuntu 14.04 mit find 4.2.2 nicht zu funktionieren. Es scheint die-name
. Aus irgendeinem seltsamen Grund habe ich Erfolg mitfind . \( ! -readable -prune \) -o -name '*.txt' -print
Wenn Sie die Suche von root "/" aus starten möchten, werden Sie wahrscheinlich folgende Ausgaben sehen:
Es ist wegen der Erlaubnis. Um dies zu lösen:
Sie können den Befehl sudo verwenden:
Es fragt nach dem Passwort des Superusers. Wenn Sie das Passwort eingeben, sehen Sie das Ergebnis, was Sie wirklich wollen. Wenn Sie nicht berechtigt sind, den Befehl sudo zu verwenden, was bedeutet, dass Sie kein Superuser-Passwort haben, bitten Sie zuerst den Systemadministrator, Sie zur sudoers-Datei hinzuzufügen.
Sie können die Standardfehlerausgabe von (Allgemein Anzeige / Bildschirm) in eine Datei umleiten und vermeiden, dass die Fehlermeldungen auf dem Bildschirm angezeigt werden! Weiterleitung in eine spezielle Datei / dev / null:
Sie können die Standardfehlerausgabe von (Allgemein Anzeige / Bildschirm) auf Standardausgabe (Allgemein Anzeige / Bildschirm) umleiten und dann mit dem Befehl grep mit dem Parameter -v "invertieren" weiterleiten, um die Ausgabezeilen mit der Berechtigung "Berechtigung verweigert" nicht anzuzeigen. Wortpaare:
quelle
sudo find...
Ich musste verwenden:
Geben Sie den Namen dessen an, was ich finden wollte, und teilen Sie ihm dann mit, dass alle Fehler nach / dev / null umgeleitet werden sollen
Erwarten Sie, dass es sich um den Speicherort des erwarteten Programms handelt, nach dem ich gesucht habe.
quelle
expect
. Stattdessenexpect
ist einfach der Name der Datei, die dieser Befehl zu finden versucht.Pipe
stderr
to/dev/null
mit 2> / dev / nullfind . -name '...' 2>/dev/null
quelle
find . -name '...' -print 2>/dev/null
Sie können auch die Prädikate
-perm
und verwenden-prune
, um zu vermeiden, dass Sie in unlesbare Verzeichnisse absteigen (siehe auch Entfernen von Ausdruckanweisungen "Berechtigung verweigert" aus dem Suchprogramm? - Unix & Linux Stack Exchange ):quelle
-perm -g+r,u+r,o+r
Stimmt nur mit Dateien überein, für die dier
(Lese-) Berechtigung für alle drei Sicherheitsprinzipale der Datei festgelegt wurde. Dies hat keine direkte Beziehung dazu, ob der aktuelle Benutzer diese Datei lesen kann oder nicht. Es kann sowohl Dateien übersehen, die der aktuelle Benutzer lesen kann , als auch Dateien abgleichen, die er nicht lesen kann.find . -type d ! \( -perm -u+r -o -perm -g+r -o -perm -o+r \) -prune -o -print
wäre die gute Lösung.-readable
mit-perm
- meine vorherigen Kommentar und betrachten Sie dieses Beispiel sehen:echo 'hi' > file; sudo chown nobody:nobody file; sudo chmod o-r file; find file -perm -u=r
drucktfile
, weil seine Benutzer gelesen Bit gesetzt, aber es bezieht sich auf die dernobody
Benutzer nicht den aktuellen Benutzer. Der aktuelle Benutzer kann diese Datei nicht lesen. versuche escat file
. Siehe auch: diese Antwort von mir.Standardfehler umleiten. Wenn Sie beispielsweise bash auf einem Unix-Computer verwenden, können Sie den Standardfehler folgendermaßen nach / dev / null umleiten:
quelle
Während die oben genannten Ansätze den Fall für Mac OS X nicht behandeln, da Mac Os X
-readable
Switches nicht unterstützt , können Sie auf diese Weise Fehler in Ihrer Ausgabe vermeiden, bei denen die Berechtigung verweigert wurde. Dies könnte jemandem helfen.find / -type f -name "your_pattern" 2>/dev/null
.Wenn Sie einen anderen Befehl verwenden
find
, um beispielsweise die Größe von Dateien mit einem bestimmten Muster in einem Verzeichnis zu ermitteln2>/dev/null
, funktioniert dies 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
Befehl am Ende des Suchvorgangs.quelle
2>/dev/null
. Können Sie bitte den Teil erklären-exec du -ch {} + 2>/dev/null | grep total$
.-exec
Option verwenden, um weitere Aktionen für die vomfind
Befehl gefundenen Dateien oder Verzeichnisse auszuführen .du -ch file_pattern
berechnet die Größe jeder übereinstimmenden Dateifile_pattern
und die letzte Zeile dieser Ausgabe ist die Gesamtsumme aller Dateien, die mit der übereinstimmenfile_pattern
. Siehe Manpage fürdu
.grep total
filtert nur die Zeile, die die Gesamtsumme extrahiert (dies ist die letzte Zeile).Diese Fehler werden in der Standardfehlerausgabe (fd 2) ausgedruckt. Um sie herauszufiltern, leiten Sie einfach alle Fehler nach / dev / null um:
oder verbinden Sie zuerst stderr und stdout und suchen Sie dann die spezifischen Fehler heraus:
quelle
Einfache Antwort:
find . > files_and_folders 2>&-
2>&-
schließt (-
) den Standard-Fehlerdateideskriptor (2
), damit alle Fehlermeldungen stummgeschaltet werden.1
wennPermission denied
andernfalls Fehler gedruckt würdenRobuste Antwort für GNU
find
:find . -type d \! \( -readable -executable \) -prune -print -o -print > files_and_folders
Führen Sie zusätzliche Optionen zu ,
find
dass-prune
(verhindern Abstieg in) , aber immer noch ein-print
beliebiges Verzeichnis ( ), die nicht ( ) beide haben und Berechtigungen, oder ( ) jede andere Datei.-type
d
\!
-readable
-executable
-o
-print
-readable
und-executable
Optionen sind GNU-Erweiterungen, die nicht Teil des POSIX-Standards sindPermission denied
bei abnormalen / beschädigten Dateien immer noch ' ' zurückgeben (siehe z. B. Fehlerbericht, der sich auf in Containernlxcfs
bereitgestellte Dateisysteme mit <v2.0.5 auswirkt).Robuste Antwort, die mit jedem POSIX-kompatiblen
find
Gerät (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 zu übergeben
grep
, und entfernen Sie alle Zeilen, die die'Permission denied'
Zeichenfolge enthalten.LC_ALL=C
Stellt die POSIX locale eine Verwendung von Umgebungsvariablen ,3>&2 2>&1 1>&3
und3>&2 2>&1
Duplikat - Datei - Deskriptoren , um die Standard - Rohr-Fehlerstrom aufgrep
, und[ $? = 1 ]
Verwendungen[]
der Fehlercode zurückgegeben , indem invertierengrep
das ursprüngliche Verhalten anzunähern , derfind
.'Permission denied'
Fehler aufgrund der Ausgabeumleitung (z. B. wenn diefiles_and_folders
Datei selbst nicht beschreibbar ist).quelle
-perm
basierte Lösung ist es nicht wert, vorgestellt zu werden, da sie grundlegender als im Zitat angegeben etwas anderes als beabsichtigt bewirkt : Es handelt sich um einen rein dateizentrierten Test, der sich auf den Eigentümer der Datei bezieht und Gruppe, von denen keine eine garantierte Beziehung zu dem Benutzer hat, der den Befehl aufruft (siehe meine Antwort . Es sieht so aus, als ob Ihre überarbeitete GNU-Lösung jetzt keine Fehlerecho 'hi' > file; sudo chown nobody:nobody file; sudo chmod o-r file; find file -perm -u=r
Druckefile
, da das Lesebit des Benutzers gesetzt ist, sich aber auf dennobody
Benutzer bezieht , nicht der aktuelle Benutzer. Der aktuelle Benutzer kann diese Datei nicht lesen. versuche escat file
.-perm
es nicht funktioniert, um die aktuellen Berechtigungen des Benutzers zu bestimmen. Diese Alternative wurde aus dieser Antwort entfernt.Um nur die Warnungen zu vermeiden, denen die Berechtigung verweigert wurde, weisen Sie find an, die nicht lesbaren Dateien zu ignorieren, indem Sie sie aus der Suche entfernen. Fügen Sie Ihrem Fund einen Ausdruck als ODER hinzu, z
Dies sagt meistens zu (eine unlesbare Datei abgleichen und aus der Liste entfernen ) ODER (einen Namen wie * .jbd abgleichen und [mit ls] anzeigen) . (Denken Sie daran, dass die Ausdrücke standardmäßig UND-verknüpft sind, es sei denn, Sie verwenden -oder.) Sie benötigen die -ls im zweiten Ausdruck, oder find fügt möglicherweise eine Standardaktion hinzu, um eine der beiden Übereinstimmungen anzuzeigen, die Ihnen auch alle nicht lesbaren Dateien anzeigt .
Wenn Sie jedoch nach echten Dateien auf Ihrem System suchen, gibt es normalerweise keinen Grund, in / dev zu suchen, das viele, viele Dateien enthält. Fügen Sie daher einen Ausdruck hinzu, der dieses Verzeichnis ausschließt, z.
Also (nicht lesbare Datei abgleichen und von Liste entfernen ) ODER (Pfad / Entwickler abgleichen und von Liste entfernen ) ODER (Datei wie * .jbd abgleichen und anzeigen) .
quelle
verwenden
Es ist dumm (weil Sie die Suche erhöhen) und unsicher, aber viel kürzer zu schreiben.
quelle
sudo
. Sie riskieren, dass Ihr gesamtes System durch einen Fehlerfind
oder eine böswillige Version oder einen falschen Aufruf, der etwas Unerwartetes schreibt , durcheinander gebracht wird. Dies könnte nicht passieren, wenn Sie dies mit normalen Berechtigungen ausführen.Keine der oben genannten Antworten hat bei mir funktioniert. Was ich im Internet finde, konzentriert sich auf: Fehler verbergen. Keiner behandelt den Prozess-Rückkehrcode / Exit-Code ordnungsgemäß. Ich benutze den Befehl find in Bash-Skripten, um einige Verzeichnisse zu finden und dann deren Inhalt zu überprüfen. Ich bewerte den Erfolg der Befehlsfindung anhand des Exit-Codes: Ein Wert von Null funktioniert, andernfalls schlägt er fehl.
Die Antwort von Michael Brux funktioniert manchmal. Aber ich habe ein Szenario, in dem es fehlschlägt! Ich habe das Problem entdeckt und selbst behoben. Ich muss Dateien beschneiden, wenn:
Das Hauptproblem hier ist: UND / ODER. Eine gute vorgeschlagene Bedingungssequenz, die ich gelesen habe, ist:
Das funktioniert nicht immer. Dies bedeutet, dass eine Bereinigung ausgelöst wird, wenn ein Match ist:
Diese Folge von Ausdrücken schlägt fehl, wenn Lesezugriff gewährt wird, jedoch kein Ausführungszugriff.
Nach einigen Tests wurde mir dies klar und ich änderte meine Shell-Skriptlösung in:
Der Schlüssel hier ist, das "nicht wahr" für einen kombinierten Ausdruck zu platzieren:
Andernfalls hat es keinen vollständigen Zugriff, was bedeutet: Beschneiden. Dies hat sich für mich in einem Szenario bewährt, in dem zuvor vorgeschlagene Lösungen fehlgeschlagen sind.
Ich gebe unten technische Details für Fragen im Kommentarbereich. Ich entschuldige mich, wenn die Details übertrieben sind.
quelle
nice
und verwendenfind $HOME -maxdepth 5 -follow ...
?${m_find_name}
) und enthält mehrere Optionen nicht relevant für die Frage (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 und gleichzeitig allgemeiner Zweck bleibt.Sie können das grep -v invert-match verwenden
so was:
Sollte zur Magie
quelle
- = Für MacOS = -
Erstellen Sie einen neuen Befehl mit dem Alias: Fügen Sie einfach die Zeile ~ / .bash_profile hinzu:
und im neuen Terminalfenster können Sie es aufrufen:
quelle
Wenn Sie CSH oder TCSH verwenden, finden Sie hier eine Lösung:
Wenn Sie eine Ausgabe an das Terminal wünschen:
Wie in den häufig gestellten Fragen zu "csh-whynot" beschrieben, sollten Sie CSH jedoch nicht verwenden.
quelle