2011-12-30 4 views
33

Quiero repetir una lista de archivos sin preocuparme por los caracteres que los nombres de archivo pueden contener, por lo que utilizo una lista delimitada por caracteres nulos. El código explicará las cosas mejor.Lectura de cadenas delimitadas nulas a través de un bucle Bash

# Set IFS to the null character to hopefully change the for..in 
# delimiter from the space character (sadly does not appear to work). 
IFS=$'\0' 

# Get null delimited list of files 
filelist="`find /some/path -type f -print0`" 

# Iterate through list of files 
for file in $filelist ; do 
    # Arbitrary operations on $file here 
done 

El siguiente código funciona cuando se lee desde un archivo, pero necesito leer de una variable que contenga texto.

while read -d $'\0' line ; do 
    # Code here 
done < /path/to/inputfile 
+1

No creo que sea posible almacenar caracteres nulos en una variable bash. Al menos, nunca he encontrado una manera de hacerlo ... –

Respuesta

53

En bash se puede utilizar una cadena multilínea

while IFS= read -r -d '' line ; do 
    # Code here 
done <<<"$var" 

en cuenta que debe inline la IFS= y sólo tiene que utilizar -d '' pero asegúrese de que hay un espacio entre la 'd' y el primer sencillo -citar. Además, agregue la bandera -r para ignorar los escapes.

Además, esto no es parte de su pregunta, pero podría sugerir una mejor manera de hacer su secuencia de comandos al usar find; usa la sustitución de procesos.

while IFS= read -r -d '' file; do 
    # Arbitrary operations on "$file" here 
done < <(find /some/path -type f -print0) 
+0

Excelente, exactamente lo que estaba buscando. ¡Gracias! Terminé usando tu segundo ejemplo. – Matthew

+0

¿Cuál es el uso del IFS desde que se establece el indicador -d? – thisirs

+4

@thisirs Al establecer 'IFS' en la cadena nula, se conservarán los caracteres de espacios en blanco iniciales y finales. – toxalot

Cuestiones relacionadas