Скажіть, у мене є каталог з іменем 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
. (Спосіб пошуку (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
тільки, а Python - насправді більш елегантна мова, ніж ці два