Durchlaufen Sie alle Ordner und führen Sie das Skript aus

8

Ich habe ein Bash-Skript install.shin meinem aktuellen Verzeichnis und ein Verzeichnis, appsdas 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; 
devo
quelle
Es sieht so aus, als würden Sie zwei Ebenen nach unten absteigen, aber nur eine Ebene nach oben zurückkehren. Versuchen Sie, cd ..zucd -
Glenn Jackman

Antworten:

9

Verwenden Sie den vollständigen Pfad Ihres übergeordneten Verzeichnisses (in meinem Fallverzeichnis appsin meinem Ausgangsverzeichnis ) und entfernen Sie einen zusätzlichen Befehl ( cd ..)

for f in ~/apps/*;
  do 
     [ -d $f ] && cd "$f" && echo Entering into $f and installing packages
  done;

Siehe Screenshot: mit cd ..Befehl und Verwendungapps/*

Geben Sie hier die Bildbeschreibung ein

Siehe Screenshot: ohne cd ..Befehl und Verwendung~/apps/*

Geben Sie hier die Bildbeschreibung ein

αғsнιη
quelle
Danke, es hat funktioniert ..curdir=$(pwd) for f in $curdir/apps/*; do [ -d $f ] && cd "$f" && echo Entering into $f and installing packages done;
Devo
@devo Ja, Sie können auch pwd verwenden, um das aktuelle Verzeichnis abzurufen. danke;)
αғsнιη
@ KasiyA Kannst du erklären, warum cd..entfernt werden sollte? sollten wir nicht zurückgehen, nachdem wir in ein Verzeichnis gegangen sind?
Banarun
@banarun Er (OP) kann auch sein eigenes Skript verwenden, muss jedoch den zweistufigen Befehl back cd verwenden. cd ../..Denn wenn er in ein $fVerzeichnis cd, befindet er sich jetzt im /path/to/apps/1Verzeichnis und nachdem cd ..er in das /path/to/appsVerzeichnis 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 vorhanden apps/apps/*Verzeichnis und [ -d $f ]wird wieder falsch . Jetzt cd ..läuft der Befehl erneut und er springt zu /path/to...
αғsнιη
... und der nächste Schritt der for-Schleife läuft und sucht nach dem Verzeichnis /path/to/apps/*und er hat Glück und er hat das Verzeichnis gefunden, in appsdem sich befindet 3(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 des appsVerzeichnisses verwendet habe. Beachten Sie, dass, wenn Sie einen Pfad in for-loop ( apps/*) verwenden, dieses nach dem Verzeichnis apps/*im aktuellen Arbeitsverzeichnis sucht. Wenn Sie jedoch den vollständigen Pfad verwenden, sucht es nur nach Verzeichnissen in diesem Pfad, nicht im aktuellen Verzeichnis.
αғsнιη
2

Sie können findzusammen mit execfür diesen Vorschlag verwenden. Du install.shsolltest es sein

#!/bin/bash
find ./apps -type d -exec echo Entering into {} and installing packages \; 

Ersetzen Sie den Text danach -execdurch Ihren Befehl

zum Beispiel

#!/bin/bash
find ./apps -type d -exec touch {}/test.txt  \;  

Es durchläuft die App und alle ihre Unterverzeichnisse und erstellt eine text.txt-Datei

g_p
quelle