Warum durchsucht dieser Befehl "find" alle Verzeichnisse?

-1

Ich möchte nur rekursiv scannen Documentsund diesen "übergeordneten" Ordner nicht verlassen. Mein Skript durchsucht mein gesamtes Dateisystem rekursiv, und ich bin nicht sicher, durch welches Element dieses Skripts dies verursacht wird. Das habe ich:

#/bin/sh
for f in $(find /home/rmintz/Documents/ -type f -name "*jpg")
do
  echo $f
done

Was muss ich ändern, damit dieses Bash-Skript nur den DocumentsOrdner und sonst nichts durchsucht ?

Ich habe den Eindruck, dass dies mein gesamtes Dateisystem scannt, da die Ausgabe im Terminal Verzeichnisse außerhalb des Bereichs von anzeigt /home/rmintz/Documents.

Ein Beispiel ist /usr/lib.

user2676140
quelle
Können Sie ein Beispiel für Ergebnisse nennen, die Ihren Erwartungen widersprechen?
Toby Speight
Wenn ich das auskommentiere fi(warum hast du es dort, wenn es kein dazugehöriges gibt if?), Funktioniert der Code für mich korrekt.
Adalee
@Adalee - das fi war Teil der Syntax, die ich auskommentiert hatte, anstatt die Zeile aus meinem Beitrag zu entfernen, habe ich versehentlich nur das # gelöscht. Beitrag aktualisiert.
user2676140
@TobySpeight - bearbeiteter Beitrag zur Beantwortung Ihres? - Ich sehe Verzeichnisse außerhalb des Bereichs von Dokumenten, die während des Scans auf dem Terminal ausgegeben werden
user2676140
1
Können Sie eine kleine Beispielausgabe Ihres Skripts zeigen? Nicht nur die "Erroneou" -Linie?
Slhck

Antworten:

5

Sie verwenden ein Anti-Pattern, indem Sie niemals eine forSchleife verwenden sollten, um die Ausgabe eines findBefehls zu durchlaufen . Es ähnelt ein wenig dem Parsen von lsAusgaben , was Sie auch niemals tun sollten.

Verwenden Sie stattdessen die findintegrierte Funktion zum Ausführen von Befehlen:

find /home/rmintz/Documents/ -type f -name "*jpg" -exec echo {} \;

Hier wird das {}durch den Namen jeder gefundenen Datei oder jedes Verzeichnisses ersetzt.

Wenn Sie eine Schleife verwenden möchten (z. B. für kompliziertere Operationen), müssen Sie jeden Dateipfad mit einem NULL-Zeichen abgrenzen. Dies ist die Aufgabe der -print0Option. Verwenden Sie whileund read, um diese Ausgabe zu analysieren:

find /home/rmintz/Documents/ -type f -name "*jpg" -print0 | while IFS= read -r -d '' file; do
    echo "$file"
done

Wenn Sie dies nicht tun, sondern die Ausgabe von analysieren find, werden die Argumente für forjedes Leerzeichen aufgeteilt. Dies bedeutet, dass Dateien mit einem Leerzeichen im Namen tatsächlich als zwei separate Dateien für angezeigt werden echo. Wenn Ihre Dateiliste zu lang wäre, würden Sie die maximale Argumentgröße für einen Befehl überschreiten. Hier hilft die Pipe im zweiten Beispiel.

In Ihrem speziellen Beispiel weiß ich nicht, warum es einen Pfad wie ausgeben würde /usr/lib, da dies nur der Fall sein könnte, wenn Sie einen tatsächlichen Schrägstrich im Dateinamen hätten, z. B. wenn Ihre Datei aufgerufen wurde /usr/lib foo.jpg.

slhck
quelle