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

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

1
задан 15 December 2015 в 20:24

3 ответа

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

find . -depth -exec rmdir {} \;  

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

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

6
ответ дан 25 May 2018 в 17:25
rmdir *

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

rmdir * 2> /dev/null
6
ответ дан 25 May 2018 в 17:25
  • 1
    Это не подходит для сценариев, так как он выйдет с ненулевым кодом состояния, но он работает. – the_drow 16 December 2013 в 22:34
  • 2
    @the_drow, как это сделать непригодным? Кстати, вы также можете использовать rmdir * 2>/dev/null || true. (Метод find (1) лучше подходит для сценариев, но по другой причине: потому что он лучше выражает то, что вы хотите сделать.) – Alois Mahdal 16 December 2015 в 05:35
  • 3
    Я часто делаю это на $HOME. С злой усмешкой. – Alois Mahdal 16 December 2015 в 05:37
  • 4
    Потому что он сообщит об ошибке, если некоторые из каталогов не пусты. – the_drow 16 December 2015 в 11:19
  • 5
    это быстрее, чем метод find? Кто-нибудь сравнил их? – Xerus 17 April 2018 в 13:58

Подход 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)
0
ответ дан 25 May 2018 в 17:25

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

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