我有一个文件夹,其中包含文件夹中的文件夹中的文件夹等......有些文件夹有文件,有些没有。我想通过查找所有没有文件的目录并删除它们来清理主文件夹。一个例子可能更有意义:
所以如果我从这个开始:
mainFolder
folder1
folder1
(空的)folder2
file.txt
folder3
(空的)
folder2
folder1
(空的)folder2
(空的)folder3
folder1
folder1
(空的)
folder3
folder1
file.txt
我应该这样结束:
mainFolder
folder1
folder2
file.txt
folder3
folder1
file.txt
所以:
/mainFolder/folder1/folder1
由于没有文件而被删除/mainFolder/folder1/folder3
由于没有文件而被删除/mainFolder/folder2
被删除是因为它没有文件,甚至所有子文件夹都是空的
我希望这是有道理的...
mainFolder
我唯一的想法是从每个子文件夹开始并递归地向下移动,删除空的子文件夹。
答案1
看看这是否符合您的要求:
find mainFolder -depth -empty -type d -exec rmdir {} \;
这应该mainFolder
使用深度优先遍历找到空目录,并删除这些目录。由于它执行深度优先遍历,因此在删除子目录时,如果父目录变空,find
则会将其识别为空并将其也删除。
答案2
find
使用支持-delete
和的实现-empty
:
find mainFolder -type d -empty -delete
这将对根目录结构进行深度优先遍历mainFolder
,并删除其中的任何空目录。
使用标准find
:
find mainFolder -depth -type d -exec sh -c 'rmdir "$1" 2>/dev/null' sh {} ';'
这将尝试rmdir
使用每一个mainFolder
以深度优先方式遍历结构时的目录。由于rmdir
无法删除非空目录,因此只会删除空目录。来自 的错误rmdir
将被丢弃。
在运行之前显式测试每个目录rmdir
:
find mainFolder -depth -type d -exec sh -c 'd="$1"; set -- "$d"/*; [ ! -e "$1" ] && rmdir "$d"' sh {} ';'
但这假设目录中没有隐藏文件。
答案3
解决方案
可能有一些开关组合可以find
做到这一点,但我认为 Python 方法更简单(并且它是跨平台的,并不是你需要的):
import os
top = './mainFolder'
for root, dirs, files in os.walk(top, topdown=False):
for name in dirs:
dir_path = os.path.join(root, name)
if not os.listdir(dir_path): # An empty list is False
os.rmdir(os.path.join(root, name))
设置和测试
创建文件目录
# https://stackoverflow.com/a/246128/295807
readonly script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
cd "$script_dir"
rm -rf mainFolder
mkdir -p mainFolder/{folder1/{folder1,folder2,folder3},folder2/{folder1,folder2,folder3/folder1/folder1},folder3/folder1}
touch mainFolder/folder1/folder2/file.txt
touch mainFolder/folder3/folder1/file.txt
测试:
$ tree mainFolder/
mainFolder/
├── folder1
│ ├── folder1
│ ├── folder2
│ │ └── file.txt
│ └── folder3
├── folder2
│ ├── folder1
│ ├── folder2
│ └── folder3
│ └── folder1
│ └── folder1
└── folder3
└── folder1
└── file.txt
12 directories, 2 files
运行Python脚本:
python work.py
测试:
$ tree mainFolder/
mainFolder/
├── folder1
│ └── folder2
│ └── file.txt
└── folder3
└── folder1
└── file.txt
4 directories, 2 files
注意:如果在Python检查文件夹是否为空之后但在实际删除它之前将文件添加到文件夹中,Python将引发异常!实际上,这并不是什么大问题,因为这两个步骤之间的时间以微秒为单位,但需要注意。