Tengo un script de shell bash que recorre todos los directorios secundarios (pero no los archivos) de un determinado directorio. El problema es que algunos de los nombres de directorio contienen espacios.
Aquí están los contenidos de mi directorio de prueba:
$ls -F test
Baltimore/ Cherry Hill/ Edison/ New York City/ Philadelphia/ cities.txt
Y el código que recorre los directorios:
for f in `find test/* -type d`; do
echo $f
done
Aquí está la salida:
prueba / Baltimore prueba / cereza colina prueba / Edison prueba / nuevo York Ciudad prueba / Filadelfia
Cherry Hill y la ciudad de Nueva York se tratan como 2 o 3 entradas separadas.
Intenté citar los nombres de archivo, así:
for f in `find test/* -type d | sed -e 's/^/\"/' | sed -e 's/$/\"/'`; do
echo $f
done
pero fue en vano.
Tiene que haber una manera simple de hacer esto.
Las respuestas a continuación son geniales. Pero para hacer esto más complicado, no siempre quiero usar los directorios que figuran en mi directorio de prueba. A veces quiero pasar los nombres de directorio como parámetros de línea de comandos.
Tomé la sugerencia de Charles de establecer el IFS y se me ocurrió lo siguiente:
dirlist="${@}"
(
[[ -z "$dirlist" ]] && dirlist=`find test -mindepth 1 -type d` && IFS=$'\n'
for d in $dirlist; do
echo $d
done
)
y esto funciona bien a menos que haya espacios en los argumentos de la línea de comando (incluso si se citan esos argumentos). Por ejemplo, llamar al script de esta manera: test.sh "Cherry Hill" "New York City"
produce el siguiente resultado:
Cereza colina Nuevo York Ciudad
list="$@"
descarta por completo la lista de valores originales, colapsando en una cadena. Por favor, siga las prácticas en mi respuesta exactamente como se indica : tal asignación no se recomienda en ningún lugar; Si desea pasar una lista de argumentos de línea de comandos a un programa, debe recopilarlos en una matriz y expandir esa matriz directamente.