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

Вопрос или проблема

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

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

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 каталога, 4 файла
$ 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)

rm -d */

Удалите все каталоги, которые пусты в этой папке. Вероятно, не бесполезно. Добавьте 2>/dev/null, чтобы игнорировать ошибки (непустые папки)

Ответ или решение

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

Если у вас есть директория, например foo/, и вы хотите удалить все пустые подкаталоги, это можно сделать с помощью команды find, а также других подходов. Рассмотрим каждый способ подробно.

Использование команды find

Команда find является мощным инструментом в Unix-подобных операционных системах, позволяющим искать файлы и директории по различным критериям. Для удаления всех пустых директорий в текущем каталоге, вы можете использовать следующую команду:

find . -type d -empty -delete

Параметры команды:

  • . — указывает, что поиск начинается с текущего каталога.
  • -type d — фильтрует результаты так, что будут найдены только директории.
  • -empty — соответствует пустым директориям.
  • -delete — удаляет все найденные директории, соответствующие условиям.

Альтернативный подход с использованием rmdir

Вы также можете использовать команду rmdir, которая предназначена для удаления пустых директорий. Однако она не удалит непустые, что может быть полезно в некоторых случаях:

find . -depth -exec rmdir {} \;

Объяснение:

  • -depth — указывает команде find заходить в подкаталоги и обрабатывать их до обработки родительских директорий.
  • -exec rmdir {} \; — вызывает rmdir для каждой найденной директории.

Чтобы игнорировать ошибки, вы можете перенаправить стандартный поток ошибок:

find . -depth -exec rmdir {} \; 2>/dev/null

Удаление только пустых подкаталогов

Если вы хотите удалить только пустые подкаталоги непосредственно в указанной директории, например в foo/, вы можете использовать:

find foo/ -type d -empty -delete -maxdepth 1

Примечания:

  • -maxdepth 1 — ограничивает поиск только на один уровень глубины в пределах foo/.

Использование Python для удаления пустых директорий

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

import os

empty_dirs = [r for r, s, f in os.walk(".") if not f and not s and r != "."]
for d in empty_dirs:
    os.rmdir(d)

Пояснение:

  • os.walk() рекурсивно обходит все директории.
  • Пустая директория определяется по отсутствию как файлов (f), так и подкаталогов (s).
  • После нахождения пустых директорий, они удаляются с помощью os.rmdir().

Применение команды rm

Вы также можете использовать команду rm с параметром -d, что позволяет удалять только пустые директории:

rm -d */

Чтобы подавить ошибки для непустых директорий, добавьте:

rm -d */ 2>/dev/null

Заключение

Все приведенные методы позволяют легко и эффективно удалять пустые директории. Выбор подхода зависит от ваших предпочтений и требований конкретной задачи. Используя команду find, rmdir, Python или rm, вы можете поддерживать порядок в файловой системе и избежать ненужного захламления. Если у вас есть дополнительные вопросы, не стесняйтесь уточнять!

Оцените материал
Добавить комментарий

Капча загружается...