Warum funktioniert meine Schleife über die Ausgabe von ls nicht?

Warum funktioniert meine Schleife über die Ausgabe von ls nicht?

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:

  1. 02.02.2014 - Jebby (
  2. 04.02.2014 - Jebby (
  3. @eaDir

Was mache ich falsch?

Antwort1

lsVermeiden 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 lsBefehl 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

verwandte Informationen