如何从命令行删除目录中的所有空目录?
假设我有一个名为foo/
的目录。 该文件夹包含子目录。 如何在一个命令中删除所有空目录?
试试这个命令:
find . -empty -type d -delete
find
命令用于从指定路径搜索与特定搜索条件匹配的文件/目录,在本例中为当前目录(因此为.
)。
-empty
选项适用于任何空的文件和目录。
-type d
选项适用于指定的文件类型; 在这种情况下, d
代表文件类型目录 。
-delete
选项是要执行的操作,对于搜索中找到的所有文件都保持true。
您可以利用rmdir
命令拒绝删除非空目录,并使用find -depth
选项自下而上遍历目录树:
find . -depth -exec rmdir {} \;
(并忽略错误),或追加2>/dev/null
来真正忽略它们。
find
的-depth
选项开始在目录树的底部查找。
rm -rf
将删除目录中的所有文件 (及其子目录,和….)以及所有目录和所有内容。
rmdir *
将删除所有空目录。 它会为每个非空的目录和文件抛出一个错误,以防止这些错误使您的终端混乱,使用
rmdir * 2> /dev/null
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
将包含该文件夹中的文件列表。 当然如果f
和s
为空,我们知道r
是空的。 - 首先,list-comprehension允许我们根据上述评估创建
empty
,所有空目录的列表。 - 第二个函数
map()
用于对empty
列表中的每个项执行os.rmdir()
。 可以使用列表理解以及替代。
作为一个脚本,这将是这样的:
#!/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)