2010-02-15 26 views
5

Soy un principiante de Python, y estoy escribiendo un script para copiar los archivos compilados de una ubicación a otra. Lo que tengo es bastante simple en el momento, algo como esto:¿Podemos hacer una copia inteligente en Python?

import os 
import shutil 

shutil.copy2 (src, dst) 
#... many more shutil.copy commands 
#src is a filename string 
#dst is the directory where the file is to be copied 

Mi problema es que muchos de los archivos que se copian son archivos grandes, y no todos ellos son re-compilado en todos los ciclos compilados. Idealmente, me gustaría copiar solo los archivos modificados en este script. ¿Hay alguna manera de que pueda hacer esto?

Respuesta

9

usted podría hacer uso de la hora de modificación del archivo, si eso es suficiente para ti:

# If more than 1 second difference 
if os.stat(src).st_mtime - os.stat(dest).st_mtime > 1: 
    shutil.copy2 (src, dst) 

O llame a una sincronización herramienta como rsync.

+3

Por qué '> 1' - Si ello no fuera'> 0'? – Wikis

+0

Depende del caso de uso, supongo. Si los archivos se escriben siempre con 'shutil.copy2', entonces se puede esperar que el tiempo de modificación sea exactamente igual (entonces es'> 0'). – AndiDog

4

Si no tiene un motivo definido para tener que codificarlo usted mismo en python, le sugiero que use rsync. Desde su página de manual:

Rsync es una herramienta de copia de archivos rápido y extraordinariamente versátil . Es famoso por su algoritmo delta-transfer , lo que reduce la cantidad de datos enviados través de la red mediante el envío de sólo las diferencias entre los archivos fuente y los archivos existentes en el destino.

Si desea codificar esto en Python, sin embargo, entonces el lugar para comenzar sería estudiar filecmp.cmp

1

¿Cómo le gustaría que buscar los archivos modificados? Solo puede usar os.path.getmtime (ruta) en el src y comprobar si es más reciente que alguna marca de tiempo almacenada (la última vez que copió, por ejemplo) o use un archivocmp.cmp (f1, f2 [, superficial]) para verificar si un archivo es más nuevo.

Tenga cuidado con filecmp.cmp, también copie la estadística (copy2) por lo que debe verificar si una comparación superficial es lo suficientemente buena para usted.

1

De la respuesta de AndiDog:

os.stat(dst).st_mtime - os.stat(src).st_mtime 

es un valor negativo si el fichero 'src' es más reciente, por lo que debe ser:

if os.stat(src).st_mtime - os.stat(dst).st_mtime > 1: 
0

Para construir sobre la respuesta de AndiDog, si tiene archivos que podrían no existir en la carpeta de destino:

# copy file if destination is older by more than a second, or does not exist 
if (not os.path.exists(dest)) or (os.stat(src).st_mtime - os.stat(dest).st_mtime > 1) : 
    shutil.copy2 (src, dest) 
Cuestiones relacionadas