¿Por qué no funciona mi bucle sobre la salida de ls?

¿Por qué no funciona mi bucle sobre la salida de ls?

Estoy intentando introducir nombres de directorio en un bucle for. Mi código es el siguiente:

td='/Test/TopDir/'
cd "$td" 
for x in $(ls -d */ | cut -f1 -d'/'); do
  echo x=$x
done

El directorio superior en el que ejecuto esto se ve así cuando ejecuto un comando ls:

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

Los resultados de mi bucle for son los siguientes:

x=2014-02-02
x=-
x=Jebby
x=(
x=2014-02-04
x=-
x=Jebby
x=(
x=@eaDir

Como puede ver, el bucle for divide los nombres de los directorios en subpartes después de cada espacio. En este ejemplo solo quiero que For Loop se ejecute tres veces con los tres directorios:

  1. 2014-02-02 - Jebby (
  2. 04/02/2014 - Jebby (
  3. @eaDir

¿Qué estoy haciendo mal?

Respuesta1

Evite analizar la salida (o al menos la parte del nombre de archivo) de lslos scripts de shell si es posible.Siempre dará problemas con la división de palabras cuando los nombres de archivos contengan espacios en blanco.

Si desea iterar sobre directorios, puede hacerlo utilizando un shell global simple, es decir

for d in */; do 
  echo "$d"
done

El lscomando solo debe usarse para mostrar listados de directorios en formato legible por humanos en la terminal.

Respuesta2

Usando @mikservsugerencia, tu puedes hacer

cd /Test/TopDir/
set -- "$PWD" */
cd /somewhere/else
td=$1 ; shift 
for x; do
  echo x="${td}/$x"
done

información relacionada