Ich sags mal gleich vorweg - die Struktur wird manchem merkwürdig vorkommen, das ganze Programm ist zuerst im IBM-Mainframe Umfeld (zOS) entstanden und ursprünglich nur als Backup-Tool.
Es hat mir aber gefallen und ich habe es angepaßt an Windows, Linux sollte auch gehen habe es aber lange nicht getestet .
Code: Alles auswählen
import os
import argparse
import shutil
from datetime import datetime
_VSC_ = 0
now = datetime.now()
# _dyyyymmdd_thhmmss
dt_string = now.strftime("_d%Y%m%d_t%H%M%S")
if _VSC_ == 1:
root = "c:/temp/pycopy/"
else:
root = os.getcwd().lower().replace("\\","/") + "/"
parser = argparse.ArgumentParser()
parser.add_argument('--file', help='Filename for PDS')
parser.add_argument('--prefix', help='Prefix added before target')
parser.add_argument('--verbose', help='Report every single copy [N]/Y')
parser.add_argument('--wait', help='Ask before copy [N]/Y')
parser.add_argument('--source', help='Single Source folder, may be .')
parser.add_argument('--target', help='Single Target folder')
parser.add_argument('--extfolder', help='Extern folder')
parser.add_argument('--recursive', help='Also copy subdirectories [Y]/N')
parser.add_argument('--homedouble', help='Allow double copy of folders in home [N]/Y')
parser.add_argument('--backupdouble', help='Allow also backup of _home [N]/Y')
parser.add_argument('--foldertimestamp', help='Add Timestamp to folder (strongly advised!) [Y]/N')
parser.add_argument('--excludetar', help='Do not store (old) .tar files in new backup [Y]/N')
args = parser.parse_args()
print("\npycopy start\n")
if args.file == None:
datei = "copylist.txt"
else:
datei = str(args.file)
# knock out --source flag
args.source = None
# print("Datei:", datei)
if args.prefix == None:
prefix = ""
else:
prefix = str(args.prefix) + "/"
# print("Prefix:", prefix)
if args.verbose == None:
verbose = False
else:
if str(args.verbose).upper()[0] == "Y":
verbose = True
else:
verbose = False
# print("Verbose:", verbose)
if args.wait == None:
wait = False
else:
if str(args.wait).upper()[0] == "Y":
wait = True
else:
wait = False
# print("Wait:", wait)
if args.source == None:
single_source = ""
else:
single_source = str(args.source) + ""
# print("Source:", single_source)
if args.target == None:
single_target = ""
else:
single_target = str(args.target) + ""
# print("Target:", single_target)
if args.extfolder == None:
extfolder = ""
else:
extfolder = str(args.extfolder).lower().replace("\\","/") + "/"
#print("Extfolder:", extfolder)
if args.recursive == None:
recursive = True
else:
if str(args.recursive).upper()[0] == "N":
recursive = False
else:
recursive = True
# print("Recursive:", recursive)
if args.homedouble == None:
allow_double_home = False
else:
if str(args.homedouble).upper()[0] == "Y":
allow_double_home = True
else:
allow_double_home = False
# print("Allow double home folders:", allow_double_home)
if args.backupdouble == None:
allow_double_backup = False
else:
if str(args.backupdouble).upper()[0] == "Y":
allow_double_backup = True
else:
allow_double_backup = False
# print("Allow double backup folders:", allow_double_backup)
if args.excludetar == None:
exclude_tar = True
else:
if str(args.excludetar).upper()[0] == "N":
exclude_tar = False
else:
exclude_tar = True
# print("exclude (old) .tar files from new backup:", exclude_tar)
if args.foldertimestamp == None:
folder_timestamp = True
else:
if str(args.foldertimestamp).upper()[0] == "N":
folder_timestamp = False
# To prevent overwritten folders
if len(prefix) == 0:
folder_timestamp = True
else:
folder_timestamp = True
# print("Use timestamp for folders:", folder_timestamp)
if not folder_timestamp:
dt_string = ""
print("root:", root, "NO dt_string")
else:
print("root:", root, "dt_string:", dt_string)
def source_liste(multiples):
new_list = []
for eintrag in multiples:
eintrag0 = eintrag.strip()
if eintrag0 == ".":
source = root
target = root + prefix + "_home" + dt_string + "/"
else:
source = root + eintrag0 + "/"
target = root + prefix + eintrag0 + dt_string + "/"
new_list.append({'source' : source, 'target' :target})
return new_list
def source_single(source, target):
if len(extfolder) == 0:
folder = root
else:
folder = extfolder
new_list = []
if source == ".":
source1 = root
target1 = folder + prefix + "_home" + dt_string + "/"
# target1 = root + prefix + "_home" + dt_string + "/"
else:
source1 = root + source + "/"
target1 = folder + prefix + target + dt_string + "/"
# target1 = root + prefix + target + dt_string + "/"
new_list.append({'source' : source1, 'target' :target1})
return new_list
liste = []
if args.source == None:
try:
liste = source_liste(open(root + datei, "r").read().splitlines())
except FileNotFoundError:
liste = []
print("File Open Error:", datei)
elif len(single_source) > 0:
if len(single_target) == 0:
single_target = single_source
liste = source_single(single_source, single_target)
# print("Liste:", liste)
def copy_windows(source, target):
global done_liste
members = []
source_show = source.replace(root, "")
if source_show == "":
source_show = "."
else:
source_show = source_show[:-1]
target_show = target.replace(root, "")
target_show = target_show[:-1]
# print("source", source)
if not os.path.exists(source):
print(source, "not found")
return
members = os.listdir(source)
if len(members) == 0:
print("No members found in", source)
return
if verbose:
print("\nSource:", source)
print("Target:", target)
print("Copy following members:")
print(', '.join(members))
else:
print("\nProcessing:", source)
if wait:
yn = input("Proceed Y/(N) : ")
else:
yn = "Y"
if yn.upper() == "Y":
rc = 0
# print("target", target)
if not os.path.exists(target):
os.makedirs(target)
print(target, "created")
for member in members:
# do not trap into recursion
if member == prefix[:prefix.find("/")]:
continue
# do not save old tar to new backup
if exclude_tar:
if member.find(".tar") > 0:
continue
if not os.path.isfile(source + member):
recurse_dir = True
for eintrag in liste + done_liste:
if eintrag['source'] == source + member + "/":
recurse_dir = False
if not allow_double_backup and source == root and member[:5] == "_home":
recurse_dir = False
if recurse_dir:
if recursive:
copy_windows(source + member + "/", target + member + "/")
# This was subdir and/or has already done. Northing else to copy
continue
if shutil.copyfile(source + member, target + member) != None:
if verbose:
print(member, "copied from", source_show, "to", target_show)
rc += 1
if rc > 0:
print(rc, "members copied")
if not allow_double_home:
done_liste.append({'source' : source, 'target' : None})
done_liste.append({'source' : target, 'target' : None})
done_liste = []
for einzel in liste:
copy_windows(einzel['source'], einzel['target'])
print("\npycopy done\n")
Was mir heute auf Anhieb auffällt - das mit den Parametern geht nicht so. Man müßte es zur Zeit so aufrufen
Code: Alles auswählen
python pycopy.py
oder so
Code: Alles auswählen
python pycopy.py --soruce test --target backup2
Code: Alles auswählen
python pycopy.py test
Das Programm sollte für einzelne Dateien auch finktionieren nicht nur für Verzeichnisse.
Ich habe eine Test-Umgebung hier eingestellt. Ich habe es auch mit größeren Dateien versucht, aber ist eben Python/Script, etwas langsam.
https://github.com/bernd22/pycopy