Espacio en el nombre de la carpeta dentro de un bucle FIND

4

Estoy trabajando en un script que necesita leer archivos dentro de un bucle FIND. Algo como esto:

DIRINI=/Volumes/dados/App\ Data/DATABASE.noindex/30000
for FILE  in 'find "$DIRINI"  -type f ' ; do
stat $FILE
stat "$FILE"
stat '$FILE'
done

El problema es: cuando el nombre de la carpeta tiene un espacio dentro, tengo que poner la var $ DIRINI dentro de una "" y esto hace que FIND funcione, pero los otros comandos dentro del bucle que usan $ DIRINI no funcionan, se dividen El nombre de la carpeta en dos usa una mitad en cada ciclo.

¿Alguien tiene una idea de lo que puedo hacer? Gracias de antemano

    
pregunta Vilefort 12.04.2018 - 14:16

2 respuestas

1

Este es un ejemplo clásico con el shell realizando la división de palabras. Cuando asigna una variable con espacios, el valor debe cotizarse, como var="foo bar" . Cuando la variable var se expande en el lado derecho de un comando, la variable debe cotizarse o el shell divide la variable en dos o más argumentos.

Cuando utiliza la sustitución de comandos en un bucle for , la sustitución de comandos se expande como resultados delimitados por el espacio. Entonces,

for line in 'find dir -type f'

se expande en

for line in filename with spaces filename file name with spaces

cada palabra se convierte en un argumento en lugar de los nombres de archivo reales.

Solución 1: consiste en canalizar los resultados de la búsqueda en un ciclo de tiempo de lectura:

find "$DIRINI"  -type f | while IFS= read -r line; do
    command "$line"
    command "$line"
done

Solución 2: use la sustitución de procesos con un ciclo de tiempo de lectura:

while IFS= read -r line; do
    command "$line"
    command "$line"
done < <(find "$DIRINI"  -type f)

Solución 3: solo usa find:

find "$DIRINI"  -type f -exec command {} \; -exec command {} \;
    
respondido por el fd0 12.04.2018 - 16:10
5

No repasen los resultados del hallazgo, hay demasiadas cosas que pueden y van a salir mal. Utilizar

find "$DIRINI" -type f -exec stat {} \;

o

find "$DIRINI" -type f -print0 | xargs -0 stat

en su lugar.

    
respondido por el nohillside 12.04.2018 - 14:34

Lea otras preguntas en las etiquetas