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 comprueban que el archivo no está en la lista con un w
rito a
modo l acceso en el l
i s
t de o
pluma f
iles antes m
o v
ing.
La psmisc
implementación de lo fuser
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:
find /folder/downloading -type f -exec sh -c '
for file do
fuser -s -w -k -0 "$file" || mv "$file" /folder/downloaded
done' sh {} +
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()
vs fchmod()
, o utimes()
que no se puede hacer a través de un descriptor de archivo)).
%.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 ( ).