使用
shutil.copytree
,我可以将包含文件和文件夹的整个目录复制到其自身的文件夹中,同时忽略某些文件夹及其内容。
source = htpc.root
destination = os.path.join(htpc.root, "old")
shutil.copytree(source, destination, ignore=shutil.ignore_patterns('userdata', 'old'))
有没有办法做同样的事情,除了移动而不是复制,所以我只会在根目录中留下
userdata
和 old
以及 old
中的所有旧文件和文件夹?
shutil
模块不提供该功能。
您可以在文件中看到
copytree()
函数和其他函数:shutil.py
。
可能位于:
/usr/local/python2.6/shutil.py
有9个函数,shuutil pydoc。
因为 copytree 已经非常接近您所需要的了,所以我会通过将 copytree() 克隆到一个新函数,然后调整它以移动而不是复制来实现此目的。
要执行此操作:
在您的系统上找到
shutil.py
并在文本编辑器/IDE 中打开。
找到显示以下内容的行:
def copytree(src, dst, symlinks=False, ignore=None):
将所有内容从此处复制到 copytree 函数的末尾。
然后将其粘贴到您的代码中并重命名为
def moveWithIgnore(src, ...
或 move2(..)
。
原始 copytree() 函数顶部的注释说 copy2() 执行“工作”。在
shutils.py
中,您可以看到它以 (src, dst)
作为参数。
shutils 中还有
move()
函数,它也需要 (src, dst)
。看来在新的 copy2
函数中将 move
替换为 moveWithIgnore
是安全的。
原始
copytree()
函数使用递归(它调用自身)。请务必更新新函数中的代码行,以便它调用自身而不是 copytree。
我相信你可以从这里拿走它:-)
从 Python 3.5 开始,您现在可以在调用
copy_function
时指定 shutil.copytree
参数。
shutil.copytree(
source,
destination,
ignore=shutil.ignore_patterns('userdata', 'old'),
copy_function=shutil.move
)
没有文件的源目录树可能会被留下。您可以像这样简单地删除它们:
shutil.rmtree(source)