Aktuelles Verzeichnis aufrufen, bis bestimmte Datei gefunden wird

Aktuelles Verzeichnis aufrufen, bis bestimmte Datei gefunden wird

Ich möchte ein Skript mit folgendem Verhalten schreiben:

  1. Prüfen Sie, ob im aktuellen Verzeichnis eine Datei, build.xml, vorhanden ist. Wenn ja, führen Sie einen Befehl aus, der dem Skript über Argumente bereitgestellt wird.
  2. Wenn nicht, öffnen Sie das aktuelle Verzeichnis und sehen Sie sich das übergeordnete Verzeichnis an. Gehen Sie zu 1.

Das Skript würde beendet, sobald wir die Datei finden oder das Stammverzeichnis erreichen. Sobald das Skript beendet ist und die Kontrolle wieder beim Benutzer liegt, möchte ich, dass das aktuelle Verzeichnis dasjenige ist, in dem das Skript ursprünglich war.

Ich kenne mich mit Shell-Skripting nicht so gut aus, bin aber für jede Hilfe/Anleitung sehr dankbar.

Antwort1

In der Bash können Sie dies beispielsweise folgendermaßen erreichen:

mkt.sh

curr=`pwd`
file_name=build.xml
echo "Current directory: $curr"
while [ "$curr" != "/" ]; do
  echo "Processing: $curr"
  file="$curr/$file_name"
  if [ -f "$file" ]; then
    echo "Found at: $file, running command..."
    cd "$curr"
    "$@"
    exit
  fi
  curr="`dirname \"$curr\"`"
done
echo "$file_name not found."

Beispiellauf:

~$ cd /tmp
/tmp$ ls mkt.sh
mkt.sh
/tmp$ mkdir -p a/b/c/d
/tmp$ echo hello > a/build.xml
/tmp$ find a
a
a/build.xml
a/b
a/b/c
a/b/c/d
/tmp$ cd a/b/c/d
/tmp/a/b/c/d$ /tmp/mkt.sh cat build.xml
Current directory: /tmp/a/b/c/d
Processing: /tmp/a/b/c/d
Processing: /tmp/a/b/c
Processing: /tmp/a/b
Processing: /tmp/a
Found at: /tmp/a/build.xml, running command...
hello
/tmp/a/b/c/d$ rm /tmp/a/build.xml 
/tmp/a/b/c/d$ r/tmp/mkt.sh cat build.xml
Current directory: /tmp/a/b/c/d
Processing: /tmp/a/b/c/d
Processing: /tmp/a/b/c
Processing: /tmp/a/b
Processing: /tmp/a
Processing: /tmp
build.xml not found.

Sobald das Skript beendet ist und die Kontrolle wieder beim Benutzer liegt, soll das aktuelle Verzeichnis dasjenige sein, in dem das Skript ursprünglich war.

Dies ist in Bash nicht erforderlich. Untergeordnete Skripte können das aktuelle Kennwort des übergeordneten Bash-Prozesses nicht ändern. Versuchen Sie Folgendes:

$ cd /tmp
$ echo "cd /usr" > a.sh
$ chmod u+x a.sh
$ pwd
/tmp
$ cat a.sh
cd /usr
$ ./a.sh
$ pwd
/tmp

Wie Sie sehen, hat sich das aktuelle Passwort nicht geändert, obwohl sich das cd /usrdarin enthaltene Skript geändert hat.

verwandte Informationen