Descargo varios archivos a una carpeta downloading
a través deHTTPie. Un script bash tiene como objetivo procesar los archivos descargados, y traté de copiar los archivos descargados a otra carpeta como
find /folder/downloading -type f -exec mv '{}' /folder/downloaded \;
pero esto también copia los archivos, que aún no han sido terminados. Intenté limitar la transferencia a archivos más antiguos agregando -mmin +5
al comando. ¿Cuál es el comando eficiente para dejar los archivos que se están escribiendo y transferir solo los archivos descargados?
Respuesta1
No es muy eficiente, pero podrías hacer:
find /folder/downloading -type f -exec sh -c '
for file do
lsof -F a "$file" | grep -q w || mv "$file" /folder/downloaded
done' sh {} +
Es decir, verifique que el archivo no aparezca en la lista con un modo de acceso w
rito a
en la l
lista s
de o
archivos f
antes de m
salir v
.
La psmisc
implementación de, fuser
como se encuentra normalmente en los sistemas operativos basados en Linux, tiene una -w
función (comprobar archivos abiertos para escritura), pero desafortunadamente solo funciona -k
para finalizar los procesos correspondientes. Sin embargo, parece que aún puedes usarlo usando la pseudoseñal 0 que no hace nada:
find /folder/downloading -type f -exec sh -c '
for file do
fuser -s -w -k -0 "$file" || mv "$file" /folder/downloaded
done' sh {} +
Elimine -s
(o incluso reemplácelo con -v
) si desea ver qué procesos impiden el movimiento.
Tenga en cuenta que si no ejecuta esos comandos como superusuario, solo obtendrá información sobre sus procesos. Si los procesos que descargan los archivos se ejecutan como un usuario diferente, no serán detectados.
También tenga en cuenta que, a menos que esté moviendo los archivos a un sistema de archivos diferente, moverlos no impedirá que cualquier proceso que esté escribiendo actualmente en el archivo termine de escribir en él.
Sin embargo, dependiendo de para qué han sido diseñados para hacer después, pueden confundirse si después de terminar de escribir, el archivo ya no está allí (por ejemplo, si quieren cambiar algunos atributos del archivo después de descargarlo y lo hacen).noa través del descriptor de archivo (como chmod()
vs fchmod()
, o utimes()
que no se puede hacer a través de un descriptor de archivo)).