2010-02-15 7 views
5

Ich bin ein Python-Neuling, und ich schreibe ein Skript, um kompilierte Dateien von einem Ort zum anderen zu kopieren. Was ich habe, ist im Moment ganz einfach, so etwas wie diese:Können wir eine intelligente Kopie in Python machen?

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 

Mein Problem ist, dass viele der Dateien werden große Dateien kopiert werden, und nicht alle von ihnen sind neu kompilieren in jedem Zyklus zu kompilieren. Im Idealfall möchte ich nur die geänderten Dateien in diesem Skript kopieren. Kann ich das irgendwie machen?

Antwort

9

Sie könnten die Verwendung der Dateibearbeitungszeit machen, wenn das für Sie genug:

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

oder eine Synchronisation rufen Werkzeug wie rsync.

+3

Warum '> 1 '- soll das nicht sein'> 0 '? – Wikis

+0

Hängt vom Anwendungsfall ab, denke ich. Wenn die Dateien immer mit 'shuthil.copy2' geschrieben werden, kann erwartet werden, dass die Änderungszeit genau gleich ist (dann ist es'> 0'). – AndiDog

4

Wenn Sie keinen eindeutigen Grund haben, dies in Python selbst zu programmieren, würde ich rsync vorschlagen. Von der man-page:

Rsync ist ein schnelles und außerordentliches vielseitiges Dateikopierwerkzeug. Es ist berühmt für seinen Delta-Transfer Algorithmus, der die Menge an Daten reduziert über das Netzwerk durch das Senden nur die Unterschiede zwischen den Quelldateien gesendet und den vorhandenen Dateien in das Ziel.

Wenn Sie dies tun wollen, in Python codieren, aber dann der Ort zu beginnen, würde filecmp.cmp

1

Wie würden Sie für geänderte Dateien suchen möchten studieren? Sie können einfach os.path.getmtime (Pfad) auf dem src verwenden und prüfen, ob das neuer ist als ein gespeicherter Zeitstempel (das letzte Mal, als Sie zum Beispiel kopiert haben) oder eine Dateiccm.cmp (f1, f2 [, shallow]) verwenden ob eine Datei neuer ist.

Aufpassen mit filecmp.cmp, du kopierst auch die Statistik (copy2), also musst du prüfen, ob ein flacher Vergleich gut genug für dich ist.

1

Von AndiDog Antwort:

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

ein negativer Wert ist, wenn 'src' Datei neuer ist, sollte es so sein:

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

aufbauen AndiDog Antwort, wenn Sie Dateien, die nicht im Zielordner existieren könnten:

# 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) 
Verwandte Themen