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

43

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

задан justingrif 30.10.2011 в 03:44
источник

4 ответа

92

Попробуйте выполнить следующую команду:

find . -empty -type d -delete

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

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

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

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

    
ответ дан Bill 30.10.2011 в 04:10
источник
6

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

find . -depth -exec rmdir {} \;  

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

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

    
ответ дан waltinator 27.12.2011 в 01:46
6
rmdir *

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

rmdir * 2> /dev/null
    
ответ дан evilsoup 11.12.2012 в 23:20
0

Подход 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)
    
ответ дан Sergiy Kolodyazhnyy 13.07.2017 в 05:24