Нахождение пустых каталогов UNIX

Я должен найти пустые каталоги для данного списка каталогов. Некоторые каталоги имеют каталоги в нем.

Если в каталогах также пусты, я могу сказать, что основной каталог пуст иначе, это не пусто.

Как я могу протестировать это?

Например:

A>A1(file1),A2 this is not empty beacuse of file1
B>B1(no file) this is empty
C>C1,C2 this is empty
88
задан mschonaker 2 July 2015 в 03:21
поделиться

7 ответов

Проверьте, выводит ли find

-type f что-либо. Вот пример:

for dir in A B C; do
    [ -z "`find $dir -type f`" ] && echo "$dir is empty"
done
33
ответ дан 24 November 2019 в 07:22
поделиться

Я создал следующую простую структуру:

 test / 
test / test2 / 
test / test2 / test2.2 / 
test / test3 / 
test / test3 / file 
 

test / test3 / file содержит нежелательный текст.

Команда find test -empty возвращает « test / test2 / test2.2 » как единственный пустой каталог.

0
ответ дан 24 November 2019 в 07:22
поделиться

Вы можете использовать следующую команду:

find . -type d -empty
42
ответ дан 24 November 2019 в 07:22
поделиться

Это немного зависит от того, что вы хотите делать с пустыми каталогами. Я использую команду ниже, когда хочу удалить все пустые каталоги в дереве, скажем, test каталог.

find test -depth -empty -delete

Следует заметить, что эта команда также удалит пустые файлы, поэтому используйте опцию -type d, чтобы избежать этого.

find test -depth -type d -empty -delete

Бросьте -delete, чтобы увидеть совпавшие файлы и каталоги.

Если ваше определение пустого дерева каталогов состоит в том, что оно не содержит файлов, то вы сможете склеить что-нибудь, основываясь на том, возвращает ли find test -type f что-нибудь.

find - отличная утилита, и RTFM рано и часто, чтобы понять, как много она может сделать :-)

.
248
ответ дан 24 November 2019 в 07:22
поделиться

простой подход был бы,

$ [ "$(ls -A /path/to/direcory)" ] && echo "not empty" || echo "its empty"

также,

if [ "$(ls -A /path/to/direcory)" ]; then
   echo "its not empty"
else 
   echo "empty directory"
0
ответ дан 24 November 2019 в 07:22
поделиться
find . -name -type d -ls |awk '($2==0){print $11}'
0
ответ дан 24 November 2019 в 07:22
поделиться

Эта рекурсивная функция, кажется, сделает трюк:

# Bash
findempty() {
    find ${1:-.} -mindepth 1 -maxdepth 1 -type d | while read -r dir
    do
        if [[ -z "$(find "$dir" -mindepth 1 -type f)" ]] >/dev/null
        then
            findempty "$dir"
            echo "$dir"
        fi
    done
}

Учитывая эту примерную структуру каталогов:

    .
    |-- dir1/
    |-- dir2/
    |   `-- dirB/
    |-- dir3/
    |   `-- dirC/
    |       `-- file5
    |-- dir4/
    |   |-- dirD/
    |   `-- file4
    `-- dir5/
        `-- dirE/
            `-- dir_V/

Результатом выполнения этой функции будет:

    ./dir1
    ./dir5/dirE/dir_V
    ./dir5/dirE
    ./dir5
    ./dir2/dirB
    ./dir2

которая пропускает /dir4/dirD. Если переместить рекурсивный вызов findempty "$dir" после fi, то функция включит этот каталог в свои результаты.

2
ответ дан 24 November 2019 в 07:22
поделиться
Другие вопросы по тегам:

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