Hallo Hendrik,
Wenn ich $@ verwende bekomme ich zwar alle Dateien die mit
test anfangen, aber eben in dem Verzeichnis in dem das script
liegt.
Ja klar, weil dein Parameter test* vor dem Start des Skriptes zu den passenden Dateinamen erweitert wird. Sowas nennt sich globbing, bzw. Pfadnamenerweiterung. Davor werden noch andere Ersetzungen vorgenommen, die aber in deinem Fall zum Glück keine Rolle spielen:
http://www.nextop.de/lhb/node62.html
Wie bekomme ich die Dateien die mit test anfangen und
in einem Unterverzeichnis liegen, das muss doch irgendwie
gehen ?
Indem Du diese Erweiterung z.B. mit Anführungszeichen verhinderst. Es gibt noch andere Möglichkeiten, wie z.B. durch
set -o noglob
bzw. kürzer
set -f
http://books.google.com/books?id=Xb6RlkhMhfYC&pg=PA6…
was aber ein wenig veraltet ist und durch andere Maßnahmen ersetzt werden sollte. Gib ruhig mal
man bash
ein und studiere den Abschnitt „Pathname Expansion“.
Du kannst dieses Verhalten gut sehen, wenn Du dir deine Variable ausgeben lässt. Ich habe dein Skript mal an meine Verzeichnisse angepasst, aber sonst relativ unverändert gelassen:
#!/bin/bash
names="$1"
echo "NAMES: $names"
cd neu;
for filename in $names; do
echo $names
echo "$( basename $filename .dat )";
done
Die Verzeichnisse sehen so aus:
kb@lenny:/tmp$ ls
alpha.dat lost+found orbit-kb seahorse-ZSEuwt v1
gconfd-kb mapping-kb pulse-kb test\_tmp.dat v1~
keyring-bFNxoP neu seahorse-KiaWC1 v
kb@lenny:/tmp$ ls neu
alpha.dat keintest.dat test1.dat test2.dat test3.dat
Wenn ich jetzt das Skript v so aufrufe:
./v test\*
wird test* zu test_tmp.dat erweitert (Globbing):
kb@lenny:/tmp$ ./v test\*
NAMES: test\_tmp.dat
test\_tmp.dat
test\_tmp
Mit diesem Aufruf
kb@lenny:/tmp$ ./v "test\*"
findet kein Globbing statt, so daß names tatsächlich den Wert test* erhält:
kb@lenny:/tmp$ ./v "test\*"
NAMES: test\*
test1.dat test2.dat test3.dat
test1
test1.dat test2.dat test3.dat
test2
test1.dat test2.dat test3.dat
test3
Ein Markieren mit Backslash wäre übrigens genauso erfolgreich:
kb@lenny:/tmp$ ./v test\*
NAMES: test\*
test1.dat test2.dat test3.dat
test1
test1.dat test2.dat test3.dat
test2
test1.dat test2.dat test3.dat
test3
Ich hoffe, dir ist jetzt klar, wo das Problem liegt. Wenn nicht, überlege dir nochmal genau, was die Zeile
for filename in $names; do
eigentlich genau macht.
Allerdings rühren die Schwierigkeiten mehr von der Aufgabenstellung her, das Ganze mittels eines Skriptes zu lösen. Für die Auflistung von Dateien (mit oder ohne Extension) in einem bekannten Unterverzeichnis bedarf es eigentlich keines Skriptes. Aber wahrscheinlich soll es ja auch mehr eine Übung sein.
Viele Grüße
Marvin