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:
- 2014-02-02 - Jebby (
- 04/02/2014 - Jebby (
- @eaDir
¿Qué estoy haciendo mal?
Respuesta1
Evite analizar la salida (o al menos la parte del nombre de archivo) de ls
los 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 ls
comando 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