Script Bash - Retrasar el comando cp hasta que se complete la escritura del archivo

1
cp /Folder1/*.mov /Folder2/
cp /Folder1/*.mov /Folder3
rm /Folder1/*.mov

Esto se ejecuta cada 60 segundos con Chron, que copia cualquier archivo * .mov de una carpeta a otras 2 carpetas y luego elimina el archivo.

Si el archivo tarda más de 60 segundos en escribir, el script se ejecuta y copia cualquier cosa en la carpeta y lo corrompe. (O si el script simplemente se ejecuta cuando se escribe un archivo).

¿Cómo puedo hacer una declaración condicional para hacer que el script espere hasta que se complete la escritura del archivo?

    
pregunta Brian 03.08.2015 - 15:56

1 respuesta

2

Bloquear archivo

Considere crear un bloqueo para anotar la copia en curso, vea bloquear su secuencia de comandos (contra ejecución paralela) :

#!/bin/sh

# Path to a lock folder
LOCK_PATH="/tmp/copying.lock"

# Ensure the lock is removed should the copy fail
trap 'rmdir "/tmp/copying.lock"; exit' 1 6 15

if mkdir "$LOCK_PATH"; then
    # Lock file did not exist and was created

    # Perform commands
    cp /Folder1/*.mov /Folder2/
    cp /Folder1/*.mov /Folder3
    rm /Folder1/*.mov   

    # Remove the lock
    rmdir "$LOCK_PATH"
fi

La secuencia de comandos de arriba solo se copia si no existe una carpeta en /tmp/copying.lock .

Copiar y mover

En lugar de copiar directamente a la ubicación final, considere realizar la copia en una ubicación temporal. Luego mueva los archivos. Un movimiento es rápido, tiende a ser atómico y es menos probable que dañe los archivos.

Alternativamente, puedes copiar usando una herramienta como rsync que incluye marcas para ayudar a proteger contra estos problemas.

    
respondido por el Graham Miln 04.08.2015 - 15:24

Lea otras preguntas en las etiquetas