- Вопрос или проблема
- Подход на Python
- Ответ или решение
- Как удалить все пустые директории из указанной папки с помощью командной строки
- Использование команды find
- Параметры команды:
- Альтернативный подход с использованием rmdir
- Объяснение:
- Удаление только пустых подкаталогов
- Примечания:
- Использование Python для удаления пустых директорий
- Пояснение:
- Применение команды rm
- Заключение
Вопрос или проблема
Скажем, у меня есть каталог с именем 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
, вы можете поддерживать порядок в файловой системе и избежать ненужного захламления. Если у вас есть дополнительные вопросы, не стесняйтесь уточнять!