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