Solução
Provavelmente existe alguma combinação de switches para find
, mas acho que a abordagem Python é mais fácil (e é multi-plataforma, não que você precise disso):
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))
Configuração e testes
Crie o diretório de arquivos
# 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
Teste:
$ tree mainFolder/
mainFolder/
├── folder1
│ ├── folder1
│ ├── folder2
│ │ └── file.txt
│ └── folder3
├── folder2
│ ├── folder1
│ ├── folder2
│ └── folder3
│ └── folder1
│ └── folder1
└── folder3
└── folder1
└── file.txt
12 directories, 2 files
Execute o script Python:
python work.py
Teste:
$ tree mainFolder/
mainFolder/
├── folder1
│ └── folder2
│ └── file.txt
└── folder3
└── folder1
└── file.txt
4 directories, 2 files
Nota: se um arquivo for adicionado à pasta depois que o Python verificar se está vazio, mas antes de realmente apagá-lo, o Python levantará uma exceção! Na prática, isso não é um grande problema, porque o tempo entre essas duas etapas é medido em microssegundos, mas é algo para se estar ciente.