Як видалити всі порожні каталоги


11

(в системі Linux)

У мене є великий набір вкладених підкаталогів у файловій системі. Я хотів би обрізати всі контури каталогів, які взагалі не містять файлів.

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

Відповіді:


15

Для всіх версій знахідки

find -depth -type d -empty -exec rmdir {} \;

Якщо у вас є новіша версія

 find -type d -empty -delete

круто, не знав -deleteпрапор.
ansi_lumen

Я теж ні. Я дізнався щось нове. Я писав сценарії раніше, використовуючи рекурсію для пошуку порожніх каталогів. Це значно спрощує це завдання.
Джеймс

2
ya -порожній прапор справді допомагає тут. Він також працює для пошуку порожніх файлів, якщо ви не включили -тип d або щойно використали -тип f
Майк

1

Можливо, це не найкраще рішення, але цей сценарій працює:

#!/bin/sh

while true
do
    DIRS=`find . -xdev -type d -exec find {}  -maxdepth 0 -empty  \;`
    if [ -z "$DIRS" ]; then
        exit 0
    else
        echo $DIRS | xargs rmdir
    fi
done

(почасти на основі відповіді на Список усіх порожніх папок )


1
Мені просто прийшло в голову, що це перейде в нескінченний цикл, якщо ви не маєте дозволу на видалення будь-якого з порожніх каталогів, тому, будь ласка, використовуйте замість нього прийняту відповідь :)
AndrewR

0
for i in `find -type d -empty`; do rmdir $i; done

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

Це правда. Я хотів би findїх у другому циклі. Ніколи цього не було в реальному житті.
ansi_lumen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.