Я должен найти пустые каталоги для данного списка каталогов. Некоторые каталоги имеют каталоги в нем.
Если в каталогах также пусты, я могу сказать, что основной каталог пуст иначе, это не пусто.
Как я могу протестировать это?
Например:
A>A1(file1),A2 this is not empty beacuse of file1
B>B1(no file) this is empty
C>C1,C2 this is empty
Проверьте, выводит ли find
что-либо. Вот пример:
for dir in A B C; do
[ -z "`find $dir -type f`" ] && echo "$dir is empty"
done
Я создал следующую простую структуру:
test /
test / test2 /
test / test2 / test2.2 /
test / test3 /
test / test3 / file
test / test3 / file
содержит нежелательный текст.
Команда find test -empty
возвращает « test / test2 / test2.2
» как единственный пустой каталог.
Вы можете использовать следующую команду:
find . -type d -empty
Это немного зависит от того, что вы хотите делать с пустыми каталогами. Я использую команду ниже, когда хочу удалить все пустые каталоги в дереве, скажем, test
каталог.
find test -depth -empty -delete
Следует заметить, что эта команда также удалит пустые файлы, поэтому используйте опцию -type d, чтобы избежать этого.
find test -depth -type d -empty -delete
Бросьте -delete
, чтобы увидеть совпавшие файлы и каталоги.
Если ваше определение пустого дерева каталогов состоит в том, что оно не содержит файлов, то вы сможете склеить что-нибудь, основываясь на том, возвращает ли find test -type f
что-нибудь.
find
- отличная утилита, и RTFM рано и часто, чтобы понять, как много она может сделать :-)
простой подход был бы,
$ [ "$(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"
Эта рекурсивная функция, кажется, сделает трюк:
# 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
, то функция включит этот каталог в свои результаты.