¿Cómo copiar todos los archivos en una carpeta excluyendo los archivos que se están escribiendo?

¿Cómo copiar todos los archivos en una carpeta excluyendo los archivos que se están escribiendo?

Descargo varios archivos a una carpeta downloadinga 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 +5al 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 writo aen la llista sde oarchivos fantes de msalir v.

La psmiscimplementación de, fusercomo se encuentra normalmente en los sistemas operativos basados ​​en Linux, tiene una -wfunción (comprobar archivos abiertos para escritura), pero desafortunadamente solo funciona -kpara 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)).

información relacionada