128 lines
4.6 KiB
Python
128 lines
4.6 KiB
Python
# shell and operating system
|
|
import os, sys, re
|
|
|
|
verbose = 0
|
|
dcount = fcount = 0
|
|
maxfileload = 100000
|
|
blksize = 1024 * 8
|
|
|
|
|
|
def cpfile(pathFrom, pathTo, maxfileload=maxfileload):
|
|
"""
|
|
copy file pathFrom to pathTo, byte for byte
|
|
"""
|
|
if os.path.getsize(pathFrom) <= maxfileload:
|
|
bytesFrom = open(pathFrom, "rb").read() # read small file all at once
|
|
bytesTo = open(pathTo, "wb")
|
|
bytesTo.write(bytesFrom) # need b mode on Windows
|
|
# bytesTo.close()
|
|
# bytesFrom.close()
|
|
else:
|
|
fileFrom = open(pathFrom, "rb") # read big files in chunks
|
|
fileTo = open(pathTo, "wb") # need b mode here too
|
|
while 1:
|
|
bytesFrom = fileFrom.read(blksize) # get one block, less at end
|
|
if not bytesFrom:
|
|
break # empty after last chunk
|
|
fileTo.write(bytesFrom)
|
|
# fileFrom.close()
|
|
# fileTo.close()
|
|
|
|
|
|
def cpall(dirFrom, dirTo):
|
|
"""
|
|
copy contents of dirFrom and below to dirTo
|
|
"""
|
|
global dcount, fcount
|
|
for file in os.listdir(dirFrom): # for files/dirs here
|
|
# print file
|
|
pathFrom = os.path.join(dirFrom, file)
|
|
pathTo = os.path.join(dirTo, file) # extend both paths
|
|
if not os.path.isdir(pathFrom): # copy simple files
|
|
try:
|
|
if verbose > 1:
|
|
print("copying", pathFrom, "to", pathTo)
|
|
cpfile(pathFrom, pathTo)
|
|
fcount = fcount + 1
|
|
except Exception:
|
|
print("Error copying", pathFrom, "to", pathTo, "--skipped")
|
|
print(sys.exc_type, sys.exc_value)
|
|
else:
|
|
if verbose:
|
|
print("copying dir", pathFrom, "to", pathTo)
|
|
try:
|
|
os.mkdir(pathTo) # make new subdir
|
|
cpall(pathFrom, pathTo) # recur into subdirs
|
|
dcount = dcount + 1
|
|
except Exception:
|
|
print("Error creating", pathTo, "--skipped")
|
|
print(sys.exc_type, sys.exc_value)
|
|
|
|
|
|
def SetUpFilter(MatchList):
|
|
RegList = []
|
|
for regexp in MatchList:
|
|
a = re.compile(regexp)
|
|
RegList.append(a)
|
|
return RegList
|
|
|
|
|
|
def cpallWithFilter(dirFrom, dirTo, MatchList):
|
|
"""
|
|
copy contents of dirFrom and below to dirTo without match
|
|
"""
|
|
global dcount, fcount
|
|
for file in os.listdir(dirFrom): # for files/dirs here
|
|
hitt = 0
|
|
for matchpat in MatchList:
|
|
if re.match(matchpat, file):
|
|
hitt = 1
|
|
# print 'Refuse: '+file
|
|
if hitt == 0:
|
|
pathFrom = os.path.join(dirFrom, file)
|
|
pathTo = os.path.join(dirTo, file) # extend both paths
|
|
if not os.path.isdir(pathFrom): # copy simple files
|
|
try:
|
|
if verbose > 1:
|
|
print("copying", pathFrom, "to", pathTo)
|
|
cpfile(pathFrom, pathTo)
|
|
fcount = fcount + 1
|
|
except Exception:
|
|
print("Error copying", pathFrom, "to", pathTo, "--skipped")
|
|
print(sys.exc_type, sys.exc_value)
|
|
else:
|
|
if verbose:
|
|
print("copying dir", pathFrom, "to", pathTo)
|
|
try:
|
|
os.mkdir(pathTo) # make new subdir
|
|
cpallWithFilter(pathFrom, pathTo, MatchList) # recur into subdirs
|
|
dcount = dcount + 1
|
|
except Exception:
|
|
print("Error creating", pathTo, "--skipped")
|
|
print(sys.exc_type, sys.exc_value)
|
|
|
|
|
|
################################################################
|
|
# Use: "python rmall.py directoryPath directoryPath..."
|
|
# recursive directory tree deletion: removes all files and
|
|
# directories at and below directoryPaths; recurs into subdirs
|
|
# and removes parent dir last, because os.rmdir requires that
|
|
# directory is empty; like a Unix "rm -rf directoryPath"
|
|
################################################################
|
|
|
|
fcount = dcount = 0
|
|
|
|
|
|
def rmall(dirPath): # delete dirPath and below
|
|
global fcount, dcount
|
|
namesHere = os.listdir(dirPath)
|
|
for name in namesHere: # remove all contents first
|
|
path = os.path.join(dirPath, name)
|
|
if not os.path.isdir(path): # remove simple files
|
|
os.remove(path)
|
|
fcount = fcount + 1
|
|
else: # recur to remove subdirs
|
|
rmall(path)
|
|
os.rmdir(dirPath) # remove now-empty dirPath
|
|
dcount = dcount + 1
|