删除除两个特定目录以外的所有文件/目录

2024-05-16 11:46:45 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,对于删除与某些情况匹配的文件/目录,似乎有几个问题要问,但我要寻找的恰恰相反:删除与我提供的示例不匹配的文件夹中的所有内容。

例如,下面是一个目录树示例:

.
|-- coke
|   |-- diet
|   |-- regular
|   `-- vanilla
|-- icecream
|   |-- chocolate
|   |-- cookiedough
|   |-- cupcake
|   |   |-- file1.txt
|   |   |-- file2.txt
|   |   |-- file3.txt
|   |   |-- file4.txt
|   |   `-- file5.txt
|   `-- vanilla
|-- lol.txt
|-- mtndew
|   |-- classic
|   |-- codered
|   |-- livewire
|   |   |-- file1.txt
|   |   |-- file2.txt
|   |   |-- file3.txt
|   |   |-- file4.txt
|   |   `-- file5.txt
|   `-- throwback
`-- pepsi
    |-- blue
    |-- classic
    |-- diet
    `-- throwback

我想删除test/icecream/cupcake/和test/mtndew/livewire/中的所有文件。其他一切都可以去,包括目录结构。那么,我怎样才能做到这一点呢?我不介意使用的语言有:bash或python。


Tags: 文件目录txt示例file1file2classicvanilla
3条回答

此命令将只在原始目录中保留所需的文件:

find test \( ! -path "test/mtndew/livewire/*" ! -path "test/icecream/cupcake/*" \) -delete

不需要cpio。它在Ubuntu、Debian 5和Mac OS X上工作

在Linux上,它将报告不能删除非空目录,这正是所需的结果。在Mac OS X上,它会悄悄地做正确的事情。

想到的是find-prune,但让它为特定路径(而不是特定目录)工作是一件痛苦的事。

就我个人而言,我只需要使用cpio和硬链接(以避免复制它们)将目录中的文件保存到新树中,然后删除旧树:

find test -path 'test/icecream/cupcake/*' -o -path 'test/mtndew/livewire/*' | cpio -padluv test-keep
rm -rf test

这也将保留您打算保留的目录的现有目录结构。

所有的“除外”都是我们有if语句的原因;以及os.walk的目录列表是可变列表的原因。

for path, dirs, files in os.walk( 'root' ):
    if 'coke' in dirs:
        dirs.remove('coke')
        dirs.remove('pepsi')

相关问题 更多 >