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 ls
comando 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 $(...) do
construcció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 ... -print0
y 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 -r
garantiza que las barras invertidas no escapen de los caracteres (de modo que, \t
por ejemplo, coincidan con una barra invertida real seguida de una t
tabulación y no de una tabulación).