Скажем, у меня есть каталог с именем foo/
. Эта папка содержит подкаталоги. Как я могу удалить все пустые каталоги в одной команде?
Попробуйте эту команду:
find . -empty -type d -delete
Команда find
используется для поиска файлов/каталогов, соответствующих определенным критериям поиска по указанному пути, в данном случае - по текущему каталогу (отсюда и .
).
Вариант -пустой
имеет значение для любого пустого файла и директории.
Вариант -типа d
имеет значение для указанного типа файла -файла ; в этом случае d
означает тип файла -директории .
Опция -удаление
является действием, которое необходимо выполнить, и поддерживается для всех файлов, найденных в процессе поиска.
rmdir *
Удаляет все пустые каталоги. Это вызовет ошибку для каждого непустого каталога и файла, чтобы эти ошибки не загромождали ваш терминал, используйте
rmdir * 2> /dev/null
$ 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)
Вы можете воспользоваться отказом команды rmdir
удалить непустые каталоги и find -параметр depth
для обхода дерева каталогов снизу вверх:
find . -depth -exec rmdir {} \;
(и игнорировать ошибки) или добавить 2> / dev / null
, чтобы их действительно игнорировать.
The Параметр -depth
для find
запускает поиск в нижней части дерева каталогов.
rm -rf
удалит все файлы в каталоге (и его подкаталоги, и ....) И все каталоги и все остальное.
find . -type d -empty -delete -maxdepth 1
Если вы хотите удалить только прямые подкаталоги foo /
.