4 votos

El espacio en el nombre de la carpeta dentro de un bucle FIND

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 que cuando el nombre de la carpeta tiene un espacio dentro, tengo que poner el var $DIRINI dentro de un "" y esto hace que FIND funcione, pero los otros comandos dentro del bucle que usan $DIRINI no funcionan, dividen el nombre de la carpeta en dos y usan la mitad en cada ciclo.

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

5voto

No hagas un bucle sobre los resultados de un hallazgo, hay demasiadas cosas que pueden y van a salir mal. Usa

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

o

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

en su lugar.

0 votos

Gracias Patrix , pero esto es solo un ejemplo , tengo toda una secuencia de comandos usando esta var $FILE dentro del bucle FIND. ¡Necesito el var para obtener la ruta correcta de cada archivo y luego usarlo!

1 votos

@vilefort use xargs o -exec para llamar a un shellscript con su código entonces.

1voto

Michael Zhou Puntos 167

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

Cuando se utiliza la sustitución de comandos en un for la sustitución del comando se expande como resultado de la delimitación del espacio. Así que,

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: es canalizar los resultados del hallazgo en un bucle de lectura:

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

Solución 2: usar la sustitución del proceso con un bucle de lectura while:

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

Solución 3: sólo usa "encontrar":

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

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X