Поиск пустых каталогов ИЛИ каталогов без файлов в них рекурсивно

Si está en un sistema GNU, intente ejecutar su aplicación con:

LD_DEBUG=libs your-application

Ver LD_DEBUG=helppara más opciones o man ld.so.

1
23.07.2019, 10:44
2 ответа

Чтобы просмотреть удаленные каталоги, просто вставьте-print:

find. -type d -empty -print -delete

Это приведет к удалению любой под-иерархии под текущим пустым каталогом, при этом будут отображаться пути к удаленным каталогам.

Действие -deleteподразумевает -depth, т. е. обход начнется снизу структуры каталога и будет продвигаться вверх (на глубину -первого -обхода ). Это означает, что в любом каталоге, который может рассматриваться как подлежащий удалению, уже будут обработаны его подкаталоги -(, и они будут удалены, если они были пусты ).

Пример:

$ mkdir -p 1/2/3/4/5/6
$ tree
.
`-- 1
    `-- 2
        `-- 3
            `-- 4
                `-- 5
                    `-- 6

6 directories, 0 file
$ find. -type d -empty -print -delete
./1/2/3/4/5/6
./1/2/3/4/5
./1/2/3/4
./1/2/3
./1/2
./1
$ tree
.

0 directory, 0 file

Если в одном каталоге есть файл:

$ mkdir -p 1/2/3/4/5/6
$ touch 1/2/3/file
$ tree
.
`-- 1
    `-- 2
        `-- 3
            |-- 4
            |   `-- 5
            |       `-- 6
            `-- file

6 directories, 1 file
$ find. -type d -empty -print -delete
./1/2/3/4/5/6
./1/2/3/4/5
./1/2/3/4
$ tree
.
`-- 1
    `-- 2
        `-- 3
            `-- file

3 directories, 1 file

Чтобы вывести список каталогов, содержащих только подкаталоги, но не удаляя их (, используйтеbash):

shopt -s globstar
for dir in./**/; do
    if [ -z "$(find "$dir" ! -type d -exec echo x \;)" ]; then
        printf '%s\n' "$dir"
    fi
done

Это зациклится на всех подкаталогах в текущем каталоге (уединенно, используя **глобус оболочки ), а затем попытается найти что-то, что не является каталогом ни в одном из них. Если что-то найдено, то этот каталог не пустой, в противном случае выводится путь к пустому каталогу.

В GNU findвы можете добавить -quitв самый конец приведенной выше команды find(после \;), чтобы немного ускорить процесс.

4
27.01.2020, 23:22

Чтобы напечатать пустые каталоги, не удаляя их, нам нужно сделать больше, чем просто удалить пустые каталоги с краев вверх.

Что-то вроде этого может сработать:

find dir/ -type d ! -exec sh -c \
  'find "$1" ! -type d -print -quit | grep -q. >/dev/null' sh {} \; -print

Внешний findнаходит каждый каталог и запускает другойfindдля каждого из них. Внутренний findпроверяет, содержит ли этот каталог (рекурсивно )какие-либо каталоги, отличные от -, и возвращает истинное значение, если это так. Внешний findзатем печатает каждый каталог, который вернул false (, т.е. не содержит каталогов, отличных от -).

Однако это довольно медленно с рекурсивным finds. Лучшее решение может включать кэширование каталогов, в которых были найдены файлы, или подход, который будет начинаться с пустых каталогов и работать до ветки, содержащей файл (s ).

2
27.01.2020, 23:22

Теги

Похожие вопросы