如何从命令行删除目录中的所有空目录?

如何从命令行删除目录中的所有空目录?

假设我有一个名为 的目录foo/。此文件夹包含子目录。如何用一个命令删除所有空目录?

答案1

尝试这个命令:

find . -empty -type d -delete

find命令用于从指定路径(在本例中为当前目录(因此为.))搜索符合特定搜索条件的文件/目录。

-empty选项适用于任何空的文件和目录。

-type d选项适用于文件指定类型;在本例中d代表文件类型目录

-delete选项是需要执行的操作,适用于搜索中找到的所有文件。

答案2

您可以利用该rmdir命令拒绝删除非空目录,以及find -depth自下而上遍历目录树的选项:

find . -depth -exec rmdir {} \;  

(并忽略错误),或者附加2>/dev/null以真正忽略它们。

-depth选项find开始在目录树的底部查找。

rm -rf将删除所有文件在目录(及其子目录,和...)中,并且所有目录和所有。

答案3

rmdir *

将删除所有空目录。它会为每个非空目录和文件抛出一个错误,为了防止这些错误弄乱你的终端,请使用

rmdir * 2> /dev/null

答案4

Python 方法

$ tree                                                                                                                                                                                  
.
├── empty_dir1
├── empty_dir2
├── subdir1
│   ├── file1.abc
│   └── file2.abc
└── subdir2
    ├── file1.abc
    └── file2.abc

4 directories, 4 files
$ python -c 'import os;empty=[r for r,s,f in os.walk(".") if not f and not s and r != "." ];map(lambda x: os.rmdir(x),empty)'
$ tree
.
├── subdir1
│   ├── file1.abc
│   └── file2.abc
└── subdir2
    ├── file1.abc
    └── file2.abc

其工作原理如下:

  • 我们使用os.walk()函数递归遍历目录树。每次迭代时,r设置为我们正在访问的当前文件夹,s包含其中的目录列表r,并将f包含该文件夹中的文件列表。当然,如果fs为空,我们知道为r空。
  • 首先,列表推导式允许我们empty根据上述评估来创建所有空目录的列表。
  • 第二个函数map()用于os.rmdir()对列表中的每个项目执行操作empty。可以使用列表推导式作为替代方法。

脚本如下:

#!/usr/bin/env python
import os
empty=[]
for r,s,f in os.walk("."):
    if not f and not s and r != ".":
        empty.append(r)

for i in empty:
    os.rmdir(i)

相关内容