/ / Bash Shell enumera los archivos que usan "for" loop - bash, for-loop

Bash Shell lista archivos usando "for" loop - bash, for-loop

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 № 1

Si 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.