如何使用忽略模式移动文件系统树?

问题描述 投票:0回答:2

使用

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
中的所有旧文件和文件夹?

python shutil
2个回答
1
投票

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。

我相信你可以从这里拿走它:-)


0
投票

从 Python 3.5 开始,您现在可以在调用

copy_function
时指定
shutil.copytree
参数。

shutil.copytree(
    source,
    destination,
    ignore=shutil.ignore_patterns('userdata', 'old'),
    copy_function=shutil.move
)

没有文件的源目录树可能会被留下。您可以像这样简单地删除它们:

shutil.rmtree(source)
© www.soinside.com 2019 - 2024. All rights reserved.