解决方案

解决方案

我有一个文件夹,其中包含文件夹中的文件夹中的文件夹等......有些文件夹有文件,有些没有。我想通过查找所有没有文件的目录并删除它们来清理主文件夹。一个例子可能更有意义:

所以如果我从这个开始:

  • 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将引发异常!实际上,这并不是什么大问题,因为这两个步骤之间的时间以微秒为单位,但需要注意。

相关内容