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