我想cp -r
在 Python 中实现一个以特殊方式处理某些目录的版本。如果您这样做mycp.py -r indir outdir
,我希望indir
将其所有文件/子目录完全复制到outdir
中,但某些文件名除外。在 Python 中最便携的方法是什么?
示例:我有这个目录结构:
dir1/
file1
dir2/
dir3/
specialdir/
myfile.bar
file1
是一个文件,specialdir
是一个包含文件的目录myfile.bar
。我想复制dir1
它的所有内容,但要专门处理其中包含*.bar
文件的目录。在这种情况下,仅specialdir
符合标准。我想mycopy
复制所有目录,dir1
但用它们自己的压缩版本替换任何特殊目录。在上面的示例中,这意味着dir1
按原样复制,但替换specialdir
为specialdir.zip
可能包含myfile.bar
.
我尝试遵循以下建议,但不确定如何处理复制:
import os
import shutil
SPECIAL_DIRS = []
def is_special_dir(path, dirnames):
"""directories are special if they have .bar files"""
special_dirs = []
for d in dirnames:
d = os.path.join(path, d)
if os.path.isdir(d):
files_in_d = os.listdir(d)
for f in files_in_d:
if f.endswith(".bar"):
# directory is special if it contains
# .bar files
special_dirs.append(d)
SPECIAL_DIRS.extend(special_dirs)
return special_dirs
def my_copy(indir, outdir):
shutil.copytree(indir, outdir, ignore=is_special_dir)
print "Found special dirs: ", SPECIAL_DIRS
# make a copy of dir1 but handle special directories
# differently
my_copy("dir1", "copy_dir1")
如果我尝试它,它会正确检测到特殊目录:
$ copy_test.py
Found special dirs: ['dir1/dir2/specialdir']
我怎样才能让它插入specialdir
到正确的相应位置copy_dir1
?我希望copy_dir1
(目标目录)具有与(源目录)完全相同的结构,dir1
除了对包含.bar
文件的目录进行特殊处理。