Как удалить все пустые каталоги в каталоге из командной строки?

Скажем, у меня есть каталог с именем foo/, Эта папка содержит подкаталоги. Как я могу удалить все пустые каталоги в одной команде?

5 ответов

Решение

Попробуйте эту команду:

find . -empty -type d -delete

find Команда используется для поиска файлов / каталогов, соответствующих определенным критериям поиска по указанному пути, в данном случае текущего каталога (отсюда .).

-empty опция верна для любого файла и директории, которые пусты.

-type d опция сохраняется для указанного типа файла; в этом случае d обозначает каталог типа файла.

-delete Параметр - это действие, которое нужно выполнить, и оно действует для всех файлов, найденных в поиске.

Вы можете воспользоваться rmdir отказ команды удалить непустые каталоги, и find -depth опция для обхода дерева каталогов снизу вверх:

find . -depth -exec rmdir {} \;  

(и игнорировать ошибки), или добавить 2>/dev/null чтобы действительно игнорировать их.

-depth возможность find начинает поиск в нижней части дерева каталогов.

rm -rf удалит все файлы в каталоге (и его подкаталогах, и....) и все каталоги и все.

rmdir *

Удалит все пустые каталоги. Он выдаст ошибку для каждого непустого каталога и файла, чтобы эти ошибки не загромождали ваш терминал, используйте

rmdir * 2> /dev/null
find . -type d -empty -delete -maxdepth 1

Если вы хотите удалить только прямые подкаталоги foo/,

Подход 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 пустой.
  • Первый список-понимание позволяет нам создавать 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)
Другие вопросы по тегам