Descargo varios archivos a una carpeta a downloading
través de HTTPie . 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 se han terminado. Intenté limitar la transferencia a archivos más antiguos agregando -mmin +5
al comando. ¿Cuál es el comando eficiente para dejar que los archivos se escriban y transferir solo los archivos descargados?
%.part
luego cambiar el nombre a%). Entonces, si el descargador se comporta bien (no hace nada más extraño), entonces debería poder cambiar el nombre de losmv
archivos ( ).Respuestas:
No es muy eficiente, pero podrías hacer:
Es decir comprueban que el archivo no está en la lista con un
w
ritoa
modo l acceso en ell
is
t deo
plumaf
iles antesm
ov
ing.La
psmisc
implementación de lofuser
que normalmente se encuentra en los sistemas operativos basados en Linux tiene una-w
función (para verificar si hay archivos abiertos para escribir), pero desafortunadamente solo funciona-k
para eliminar los procesos correspondientes. Sin embargo, parece que todavía puede usarlo usando la pseudo-señal 0 que no hace nada:Elimine el
-s
(o incluso reemplácelo con-v
) si desea ver qué proceso (s) está (n) impidiendo el movimiento.Tenga en cuenta que si no está ejecutando esos comandos como superusuario, solo obtendrá información sobre sus procesos. Si los procesos de descarga de los archivos se ejecutan como un usuario diferente, permanecerán sin ser detectados.
También tenga en cuenta que, a menos que mueva los archivos a un sistema de archivos diferente, mover los archivos no impedirá que el proceso que se está escribiendo actualmente en el archivo termine de escribir en él.
Sin embargo, dependiendo de lo que han sido diseñados para hacer después, podrían confundirse si después de terminar la escritura, el archivo ya no está allí (por ejemplo, si quieren cambiar algunos atributos del archivo después de descargarlo y también lo hacen no a través del descriptor de archivo (como
chmod()
vsfchmod()
, outimes()
que no se puede hacer a través de un descriptor de archivo)).fuente
-exec
se ejecutash
con un comando (-c '...'
) y{} +
le dice que ponga más de un resultado en ese comando a la vez. Lo que no entiendo es por qué hay otrosh
después del comando. ¿Qué me estoy perdiendo?$0
. Es decir, le da un nombre a ese script en línea. Ese nombre puede usarse en mensajes de error como,<name>: fuser: command not found
por ejemplo, porsh
lo que generalmente es una buena opción en este caso para dejar en claro qué informa ese mensaje de error (eso también sería lo que sería si no presentamos ningún argumento después del guión en línea).