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
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.