Dateien und Ordner rekursiv kopieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
ptofrme
User
Beiträge: 2
Registriert: Montag 18. Januar 2021, 20:06

Hallo zusammen,

ich würde gerne Dateien und Ordner gerne rekursiv kopieren d. h. ich würde gerne ein Quellpfad angeben, dann soll dort alles rekursiv durchgegangen werden und Dateien und Ordner an einem Zielpfad erstellt werden.

Code: Alles auswählen

quellPfad = "C:\\pythonTest\\quelle\\"
zielPfad = "C:\\pythonTest\\ziel\\"

for dirpath, dirnames, filenames in os.walk(quellPfad, topdown=True):

	for dir in dirnames:
		# Was fehlt hier an Code?
	for file in filenames:
		# Was fehlt hier an Code?
	

Soweit habe ich den Teil hinbekommen. Ich denke ich muss dann immer alle Ordner und alle Dateien in den for-Schleifen durchlaufen. Wie kopiere ich aber die jeweiligen Ordner und Dateien von der Quelle zum jeweiligen Ziel? Ist mein Ansatz überhaupt richtig?


Ich bin Programmieranfänger.

Über Hilfe würde ich mich freuen und wünsche euch einen schönen Abend!
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Dafür gibt es schon shutil.copytree.
ptofrme
User
Beiträge: 2
Registriert: Montag 18. Januar 2021, 20:06

Hi, danke für deine Antwort.

Ich möchte aber noch prüfen ob sich die Checksummen der Datei von Quelle und Ziel unterscheiden. Wenn ja, wird die Datei am Ziel umbenannt und erst dann wieder eine Kopie übertragen. Auf der zweiten NAS läuft dann ein Bash Skript was danach die Rechte für das Ändern/Löschen der Kopieren Dateien der Quell-NAS entzieht. Somit werden automatisch Backups erstellt und es ist ein Schutz vor Ransomware, denn wenn dieser auf der Quelle die Dateien verschlüsselt habe ich immer noch die alten Dateien im Zielsystem.

Den Teil der Berechnung der Checksumme etc. habe ich bereits gelöst. Auch das prüfen ob ein Ordner oder Datei vorhanden ist. Lediglich das Kopieren klappt nicht.

Hast du oder vielleicht jemand anderes eine Idee welche Befehle ich an dieser Stelle verwenden kann? Also für das reine kopieren eines Ordners/Datei. Das Problem ist, dass ich den Teil im Pfad nicht ausgetauscht bekomme.
Bl3nder
User
Beiträge: 139
Registriert: Freitag 3. Januar 2020, 17:07

Hier findest du die Doku https://docs.python.org/3/library/shutil.html


Ich verstehe nicht ganz was du mit Checksumme meinst ( meinst du die Datei größe )?

Wenn ja da du mit os arbeitest:
os.path.getsize("pfad_zu_deiner_datei")

Sowas in der Art -> habe Ich nun nicht getestet

Code: Alles auswählen

quellPfad = "C:\\pythonTest\\quelle"
zielPfad = "C:\\pythonTest\\ziel"
for file in os.listdir(zielPfad):
    quell_file = os.path.join(quellPfad,file)
    ziel_file = os.path.join(zielPfad,file)
    if os.path.isfile(quell_file):#True wenn Datei vorhanden
        if os.path.getsize(quell_file) != os.path.getsize(ziel_file):#Datein unterschiedlich groß
            shutil.copy(str(quell_file), str(ziel_file))
    else:
        shutil.copy(str(quell_file), str(ziel_file))
Eine Vision ohne Aktion bleibe eine Illusion
Bl3nder
User
Beiträge: 139
Registriert: Freitag 3. Januar 2020, 17:07

Ich habe eben gesehen das noch ein continue in der for schleife fehlt Ich kann leider meinen Beitrag aber nicht mehr bearbeiten
Eine Vision ohne Aktion bleibe eine Illusion
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

@Bl3nder: bei einem Backup-Programm will man vielleicht nicht nur die Dateigröße prüfen.
`os.path` ist veraltet. Benutze pathlib.Path. Und irgendwie sind Quell- und Zielpfad vertauscht.
Antworten