1 votos

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

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

Esto se ejecuta cada 60 segundos usando 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 escribirse el script se ejecuta y copia todo lo que hay en la carpeta y lo corrompe. (O si el script simplemente se ejecuta cuando se está escribiendo un archivo).

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

2voto

Steve Evans Puntos 155

Archivo de bloqueo

Considere la posibilidad de crear un candado para anotar la copia en curso, véase bloquear su script (contra la 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

El script anterior sólo copia si no existe ninguna carpeta en /tmp/copying.lock .

Copiar y mover

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

Como alternativa, puede copiar utilizando una herramienta como rsync que incluye banderas para ayudar a protegerse de estos problemas.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X