shell for loop con búsqueda con nombres de archivos que contienen espacios

shell for loop con búsqueda con nombres de archivos que contienen espacios

Considere un directorio con nombres de archivos típicos de Microsoft Windows:

Nuevo documento.txt
Foo.doc
Foo - Copiar.doc

Me gustaría hacer algo en cada archivo, como por ejemplo:

para enviar archivo en $(buscar ${POLLDIR} -tipo f -mmin +1 -print0)
hacer
  eco \"${enviar archivo}\"
  ls -l "${enviar archivo}"
  etcétera
  si exito_arriba
  entonces
    mv "${sendfile}" "${donedir}/."
  fi
hecho

Tenga en cuenta que no quiero ejecutar solo 1 comando con "${sendfile}" como argumento. Necesito el bucle para verificar errores y otras cosas (como mover "${sendfile}" en caso de éxito e iniciar sesión en caso de error).

¿Qué es una construcción "correcta" para escapar/entrecomillar los nombres de archivos de buscar para poder usarlos en una apariencia como en el lscomando anterior? Si es posible, me gustaría evitar almacenar los nombres de archivos en un archivo temporal uno por uno.

No creo que, find -printf '"%p"\n'como lo sugiere triplee en los comentarios, pregunte [¿Cómo uso buscar cuando el nombre del archivo contiene espacios?] funcionaría en una for foo in $(...) doconstrucción.

Creo que reemplazar caracteres "ilegales" ?funcionaría para mí en este caso, pero sería muy feo. El bucle for finalmente procesa archivos en ${POLLDIR} y luego los mueve cuando termina, por lo que la posibilidad de que "Foo bar.txt" colisione con "Foo-bar.txt" es 0 (-ish).

Mi mejor intento hasta ahora es:

para enviar archivo en $(buscar ${POLLDIR} -type f -mmin +1 -print | tr ' ' '?')
hacer
  ...
hecho

¿Alguna sugerencia más limpia?

Respuesta1

Usar find ... -print0 | while IFS="" read -d ""constructo:

find "${POLLDIR}" -type f -mmin +1 -print0 | while IFS="" read -r -d "" sendfile
  do
    echo "${sendfile}"
    ls -l "${sendfile}"
    and-so-on
    if success_above
      then
        mv "${sendfile}" "${donedir}/."
    fi
done

Establece -d ""el carácter de fin de línea en nulo ( \0), que es lo que separa cada nombre de archivo encontrado find ... -print0y IFS=""es necesario para trabajar también con nombres de archivos que contienen nuevas líneas; según POSIX, solo las barras diagonales ( /) y nulos ( \0) están prohibidas. Esto -rgarantiza que las barras invertidas no escapen de los caracteres (de modo que, \tpor ejemplo, coincidan con una barra invertida real seguida de una ttabulación y no de una tabulación).

información relacionada