Ich versuche, Verzeichnisnamen in eine For-Schleife einzuspeisen. Mein Code lautet wie folgt:
td='/Test/TopDir/'
cd "$td"
for x in $(ls -d */ | cut -f1 -d'/'); do
echo x=$x
done
Das oberste Verzeichnis, in dem ich dies ausführe, sieht beim Ausführen eines ls-Befehls folgendermaßen aus:
ls -l
drwxrwxrwx 4 Jason users 4096 May 6 06:36 2014-02-02 - Jebby (
drwxrwxrwx 3 Jason users 4096 May 6 06:09 2014-02-04 - Jebby (
drwxrwxrwx 2 root root 4096 May 6 06:09 @eaDir
-rw-r--r-- 1 Jason users 3956225 Jan 26 10:17 DSC01062.JPG
-rw-r--r-- 1 Jason users 3927603 Jan 26 10:18 DSC01063.JPG
Die Ergebnisse meiner For-Schleife sind wie folgt:
x=2014-02-02
x=-
x=Jebby
x=(
x=2014-02-04
x=-
x=Jebby
x=(
x=@eaDir
Wie Sie sehen, zerlegt die For-Schleife die Verzeichnisnamen nach jedem Leerzeichen in Unterteile. In diesem Beispiel möchte ich, dass die For-Schleife nur dreimal mit den drei Verzeichnissen ausgeführt wird:
- 02.02.2014 - Jebby (
- 04.02.2014 - Jebby (
- @eaDir
Was mache ich falsch?
Antwort1
ls
Vermeiden Sie wenn möglich das Parsen der Ausgabe (oder zumindest des Dateinamenteils) in Shell-Skripten.Bei Dateinamen, die Leerzeichen enthalten, treten immer Probleme mit der Worttrennung auf.
Wenn Sie über Verzeichnisse iterieren möchten, können Sie das mit einem einfachen Shell-Glob tun, d. h.
for d in */; do
echo "$d"
done
Der ls
Befehl sollte nur zum Anzeigen von Verzeichnislisten in für Menschen lesbarer Form im Terminal verwendet werden.
Antwort2
Mit @mikserv'sAnregung, du kannst tun
cd /Test/TopDir/
set -- "$PWD" */
cd /somewhere/else
td=$1 ; shift
for x; do
echo x="${td}/$x"
done