Як видалити всі пусті каталоги в каталозі з командного рядка?


58

Скажіть, у мене є каталог з іменем foo/. Ця папка містить підкаталоги. Як я можу видалити всі порожні каталоги в одній команді?

Відповіді:


119

Спробуйте цю команду:

find . -empty -type d -delete

findКоманда використовується для пошуку файлів / каталогів , які відповідають певним критеріям пошуку по зазначеному шляху, в цьому випадку поточний каталог (звідси .).

Ця -emptyопція справедлива для будь-якого файлу та каталогу, які порожні.

Ця -type dопція справедлива для вказаного типу файлу ; в цьому випадку dозначає каталог файлів типу .

Цей -deleteваріант - це дія, яку слід виконати, і справедливо для всіх файлів, знайдених у пошуку.


Я думаю, що це найпростіший спосіб зробити це, тому я збираюся йти вперед і відзначити це як відповідь.
justingrif

Гей, Білл, я спробував поставити ще одне подібне питання, і воно не дозволило мені, тому що він сказав, що це дура, тому я сподівався, що ви зможете відповісти мені тут. Скажіть, я хотів зробити те саме, що вище, але видалити всі каталоги, чи вони порожні чи ні.
justingrif

3
Як ви б видалити каталоги, незалежно від того , чи є вони порожні, введіть наступну команду: rm -rf <directory-name>. Це видалить каталог разом із усім його вмістом, включаючи файли та підкаталоги. Цей -rпараметр означає видалення рекурсивно, тоді як -fкоманда означає не підказувати перед видаленням. Якщо ви хочете, щоб вам було запропоновано перед видаленням каталогу / файлу, замініть -fпараметр -iопцією.
Білл

Що робити, якщо у вказаному каталозі були якісь файли, які я хотів зберегти. Отже, я хотів видалити всі каталоги в / foo / bar /, але зберегти будь-які файли, які можуть бути там.
justingrif

2
Це можна зробити, використовуючи трубу для stdoutвведення однієї команди (наприклад find) в stdinіншу (наприклад rm), однак, будьте дуже обережні, оскільки це може видалити або видалити файли / каталоги, які ви не хочете видалити! Для отримання додаткової інформації про те, як це зробити, перегляньте manсторінки кожної з цих команд. Щоб бути безпечним, завжди перевіряйте такі речі у тимчасовому каталозі, перш ніж випробувати реальну річ.
Білл

11

Ви можете скористатися rmdirвідмовою команди видалити непорожні каталоги та find -depthопцією переходу дерева каталогів знизу вгору:

find . -depth -exec rmdir {} \;  

(і ігноруйте помилки) або додайте, 2>/dev/nullщоб дійсно їх ігнорувати.

-depthМожливість findпочатку знаходити в нижній частині дерева каталогів.

rm -rfвидалить усі файли в каталозі (і його підкаталоги, і ....) І всі каталоги та все.


8
rmdir *

Видалять усі порожні каталоги. Він видасть помилку для кожного не порожнього каталогу та файлів, щоб зупинити ці помилки, захаращуючи ваш термінал, використовуйте

rmdir * 2> /dev/null

Це не підходить для сценаріїв, оскільки він вийде з ненульовим кодом статусу, але він працює.
the_drow

@the_drow як це зробити непридатним? До речі ви також можете використовувати rmdir * 2>/dev/null || true. (Спосіб пошуку (1) кращий для сценаріїв, але з іншої причини: тому що він краще виражає те, що ви хочете зробити.)
Алоїс Магдал

Я часто роблю це в $HOME. Злою злішкою.
Алоїз Магдал

Тому що він повідомить про помилку, якщо деякі каталоги не будуть порожніми.
the_drow

це швидше, ніж метод пошуку? Хтось порівнював їх?
Xerus


0

Підхід Python

$ 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)

надто складний для просто питань :(
nurulhudamustaqim

@nurulhudamustaqim Залежить від точки зору. Для багатьох користувачів Linux, які звикли до Python, це насправді дуже скромно :) І до того ж його різноманітність. Сучасна системна адміністрація не обмежується лише bash або /bin/shтільки, а Python - насправді більш елегантна мова, ніж ці два
Сергій Колодяжний,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.