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

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

71
задан 15 December 2015 в 19:24

5 ответов

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

find . -empty -type d -delete

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

Вариант -пустой имеет значение для любого пустого файла и директории.

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

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

137
ответ дан 15 December 2015 в 19:24
rmdir *

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

rmdir * 2> /dev/null
9
ответ дан 15 December 2015 в 19:24

Подход 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 пусто.
  • первое понимание списка позволяет нам создать пустые , список всех пустых каталогов на основе оценки, указанной выше.
  • вторая функция, map () используется для выполнения 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)
0
ответ дан 15 December 2015 в 19:24

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

find . -depth -exec rmdir {} \;  

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

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

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

12
ответ дан 15 December 2015 в 19:24
find . -type d -empty -delete -maxdepth 1

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

2
ответ дан 22 November 2019 в 23:42

Другие вопросы по тегам:

Похожие вопросы: