Ich habe ein Bash-Skript install.sh
in meinem aktuellen Verzeichnis und ein Verzeichnis, apps
das mehrere Verzeichnisse enthält. Ich möchte diese Unterverzeichnisse im App-Ordner durchlaufen und ein Skript ausführen. Nach dem Ausführen des Skripts im ersten Ordner sollte es zurückkehren und in den nächsten Ordner gelangen. Ich habe es versucht, aber es wird nacheinander übersprungen. Ich meine, es geht in alle ungeraden Ordner und nicht in gerade Ordner.
Code in install.sh
for f in apps/*;
do
[ -d $f ] && cd "$f" && echo Entering into $f and installing packages
cd ..
done;
cd ..
zucd -
Antworten:
Verwenden Sie den vollständigen Pfad Ihres übergeordneten Verzeichnisses (in meinem Fallverzeichnis
apps
in meinem Ausgangsverzeichnis ) und entfernen Sie einen zusätzlichen Befehl (cd ..
)Siehe Screenshot: mit
cd ..
Befehl und Verwendungapps/*
Siehe Screenshot: ohne
cd ..
Befehl und Verwendung~/apps/*
quelle
curdir=$(pwd) for f in $curdir/apps/*; do [ -d $f ] && cd "$f" && echo Entering into $f and installing packages done;
cd..
entfernt werden sollte? sollten wir nicht zurückgehen, nachdem wir in ein Verzeichnis gegangen sind?cd ../..
Denn wenn er in ein$f
Verzeichnis cd, befindet er sich jetzt im/path/to/apps/1
Verzeichnis und nachdemcd ..
er in das/path/to/apps
Verzeichnis gesprungen ist (jetzt ist das aktuelle Verzeichnis/path/to/apps
) und wenn der nächste Schritt erfolgt die for-Schleife weiter, sucht der Befehl das Verzeichnis ,/path/to/apps/apps/*
während das nicht , weil ha doens't ist vorhandenapps/apps/*
Verzeichnis und[ -d $f ]
wird wieder falsch . Jetztcd ..
läuft der Befehl erneut und er springt zu/path/to
.../path/to/apps/*
und er hat Glück und er hat das Verzeichnis gefunden, inapps
dem sich befindet3
(weil er den zweiten Index der for-Schleife für das zweite Verzeichnis verloren hat) und dies hat dazu geführt, dass er gerade ungerade Ordner gesehen hat. Und warum ich das entfernt habe (cd ..
) und den vollständigen Pfad desapps
Verzeichnisses verwendet habe. Beachten Sie, dass, wenn Sie einen Pfad in for-loop (apps/*
) verwenden, dieses nach dem Verzeichnisapps/*
im aktuellen Arbeitsverzeichnis sucht. Wenn Sie jedoch den vollständigen Pfad verwenden, sucht es nur nach Verzeichnissen in diesem Pfad, nicht im aktuellen Verzeichnis.Sie können
find
zusammen mitexec
für diesen Vorschlag verwenden. Duinstall.sh
solltest es seinErsetzen Sie den Text danach
-exec
durch Ihren Befehlzum Beispiel
Es durchläuft die App und alle ihre Unterverzeichnisse und erstellt eine text.txt-Datei
quelle