Ich möchte nur rekursiv scannen Documents
und 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 Documents
Ordner 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
.
bash
script
bash-scripting
user2676140
quelle
quelle
fi
(warum hast du es dort, wenn es kein dazugehöriges gibtif
?), Funktioniert der Code für mich korrekt.Antworten:
Sie verwenden ein Anti-Pattern, indem Sie niemals eine
for
Schleife verwenden sollten, um die Ausgabe einesfind
Befehls zu durchlaufen . Es ähnelt ein wenig dem Parsen vonls
Ausgaben , was Sie auch niemals tun sollten.Verwenden Sie stattdessen die
find
integrierte Funktion zum Ausführen von Befehlen: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
-print0
Option. Verwenden Siewhile
undread
, um diese Ausgabe zu analysieren:Wenn Sie dies nicht tun, sondern die Ausgabe von analysieren
find
, werden die Argumente fürfor
jedes Leerzeichen aufgeteilt. Dies bedeutet, dass Dateien mit einem Leerzeichen im Namen tatsächlich als zwei separate Dateien für angezeigt werdenecho
. 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
.quelle