Uso el siguiente script de Bash Shell para listar los archivos ".txt" de forma recursiva en el directorio actual:
#!/bin/bash
for file in $( find . -type f -name "*.txt" )
do
echo $file
# Do something else.
done
Sin embargo, algunos de los archivos ".txt" debajo del directorio actual tienen espacios en sus nombres, por ejemplo. "mi testing.txt". El listado se corrompe, por ejemplo. "my testing.txt" aparece como
my
testing.txt
Parece que el bucle "for" usa "espacio en blanco" (espacio, n, etc.) para separar la lista de archivos, pero en mi caso solo quiero usar "n" para separar la lista de archivos.
¿Hay alguna manera de modificar este script para lograr este propósito? Alguna idea.
Gracias por adelantado.
Respuestas
7 para la respuesta № 1Si estás usando bash 4, solo usa un glob:
#!/bin/bash
shopt -s globstar
for file in **/*.txt
do
if [[ ! -f "$file" ]]
then
continue
fi
echo "$file"
# Do something else.
done
Asegúrese de citar "$file"
o tendrás el mismo problema en otra parte. **
hará coincidir recursivamente los archivos y directorios si ha habilitado globstar
.
7 para la respuesta № 2
Sí tienen find
Separe los nombres de los archivos con NUL y use read
delimitar en NUL
. Esto se repetirá con éxito sobre cualquier nombre de archivo ya que NUL no es un carácter válido para un nombre de archivo.
#!/bin/bash
while IFS= read -r -d "" file; do
echo "$file"
# Do something else.
done < <(find . -type f -name "*.txt" -print0)
Alternativamente, si el # do something else
No es demasiado complejo, puedes usarlo. find
"s -exec
Opción y no tener que preocuparse por la delimitación adecuada.