Ich schreibe ein Skript in Bash unter Linux und muss alle Unterverzeichnisnamen in einem bestimmten Verzeichnis durchgehen. Wie kann ich diese Verzeichnisse durchlaufen (und normale Dateien überspringen)?
Beispiel:
Das angegebene Verzeichnis /tmp/
enthält die folgenden Unterverzeichnisse:/tmp/A, /tmp/B, /tmp/C
Ich möchte A, B, C abrufen.
Antworten:
Eine kurze Erklärung:
find
findet Dateien (ganz offensichtlich).
ist das aktuelle Verzeichnis, das nach demcd
is/tmp
(IMHO ist dies flexibler als/tmp
direkt imfind
Befehl. Sie haben nur einen Ort, den Siecd
ändern müssen, wenn Sie mehr Aktionen in diesem Ordner ausführen möchten).-maxdepth 1
und-mindepth 1
stellen Sie sicher, dassfind
nur im aktuellen Verzeichnis gesucht wird und sich nicht.
im Ergebnis befindet-type d
sucht nur nach Verzeichnissen-printf '%f\n
Gibt für jeden Treffer nur den Namen des gefundenen Ordners (plus eine neue Zeile) aus.Et voilà!
quelle
while..done
Sie diese Lösung an: transnum.blogspot.de/2008/11/… Innerhalb der Schleife können Sie verrückt werden.find
Mit der-exec
Option können Sie einen beliebigen Befehl für jede Datei / jedes Verzeichnis ausführen.Alle Antworten werden bisher verwendet
find
, daher hier eine mit nur der Shell. In Ihrem Fall sind keine externen Tools erforderlich:quelle
find
wenn Sie einen Schrägstrich an eine Wildcard anhängen könnenfor dir in */; do echo $dir; done
gilt auch für Verzeichnisse im aktuellen Verzeichnis.dir=${dir%*/}
und wasecho ${dir##*/}
tut./tmp/*/
. Es ist ratsam, eine Überprüfung einzuschließen, um festzustellen, ob das Verzeichnis tatsächlich vorhanden ist.Sie können alle Verzeichnisse einschließlich versteckter Verzeichnisse (beginnend mit einem Punkt) durchlaufen mit:
Hinweis: Die Verwendung der Liste
*/ .*/
funktioniert in zsh nur, wenn mindestens ein verstecktes Verzeichnis im Ordner vorhanden ist. In Bash wird es auch.
und zeigen..
Eine andere Möglichkeit für bash, versteckte Verzeichnisse einzuschließen, wäre die Verwendung von:
Wenn Sie Symlinks ausschließen möchten:
Verwenden Sie diesen in den Schleifen, um nur den nachfolgenden Verzeichnisnamen (A, B, C wie in Frage gestellt) in jeder Lösung auszugeben:
Beispiel (dies funktioniert auch mit Verzeichnissen, die Leerzeichen enthalten):
quelle
Funktioniert mit Verzeichnissen, die Leerzeichen enthalten
Inspiriert von Sorpigal
Originaler Beitrag (funktioniert nicht mit Leerzeichen)
Inspiriert von Boldewyn : Beispiel einer Schleife mit
find
Befehl.quelle
quelle
basename
. Ich würde dies meiner Antwort vorziehen.Die Technik, die ich am häufigsten benutze, ist
find | xargs
. Wenn Sie beispielsweise jede Datei in diesem Verzeichnis und alle Unterverzeichnisse weltweit lesbar machen möchten, haben Sie folgende Möglichkeiten:Die
-print0
Option endet mit einem NULL-Zeichen anstelle eines Leerzeichens. Die-0
Option teilt ihre Eingabe auf die gleiche Weise auf. Dies ist also die Kombination für Dateien mit Leerzeichen.Sie können sich diese Befehlskette so vorstellen, dass sie jede ausgegebene Zeile
find
am Ende eineschmod
Befehls festhält.Wenn der Befehl, den Sie als Argument ausführen möchten, in der Mitte statt am Ende ausgeführt wird, müssen Sie etwas kreativ sein. Zum Beispiel musste ich in jedes Unterverzeichnis wechseln und den Befehl ausführen
latemk -c
. Also habe ich (aus Wikipedia ) verwendet:Dies hat den Effekt
for dir $(subdirs); do stuff; done
, ist jedoch für Verzeichnisse mit Leerzeichen in ihren Namen sicher. Außerdem werden die separaten Aufrufestuff
in derselben Shell ausgeführt, weshalb wir in meinem Befehl mit zum aktuellen Verzeichnis zurückkehren müssenpopd
.quelle
eine minimale Bash-Schleife, aus der Sie aufbauen können (basierend auf der Antwort von ghostdog74)
um eine ganze Reihe von Dateien nach Verzeichnis zu komprimieren
quelle
directory
, nicht nur Unterverzeichnisse.find . -type d -maxdepth 1
quelle
Wenn Sie mehrere Befehle in einer for-Schleife ausführen möchten, können Sie das Ergebnis von
find
withmapfile
(bash> = 4) als Variable speichern und das Array mit durchlaufen${dirlist[@]}
. Es funktioniert auch mit Verzeichnissen, die Leerzeichen enthalten.Der
find
Befehl basiert auf der Antwort von Boldewyn. Weitere Informationen zumfind
Befehl finden Sie dort.quelle