Три лучших ответа:
- Первый основан на
find
как запрашиваемый OP; - Второй основан на
ls
; - Третий - 100%
bash
, но он вызывает (порождает) суб-оболочку.
1.[ $(find your/dir -prune -empty) = your/dir ]
dn=your/dir
if [ x$(find "$dn" -prune -empty) = x"$dn" ]; then
echo empty
else
echo not empty
fi
test:
> mkdir -v empty1 empty2 not_empty
mkdir: created directory 'empty1'
mkdir: created directory 'empty2'
mkdir: created directory 'not_empty'
> touch not_empty/file
> find empty1 empty2 not_empty -prune -empty
empty1
empty2
find
напечатал только две пустые директории (empty1
и empty2
).
Этот ответ выглядит как -maxdepth 0 -empty
от Ариэль .Но этот ответ немного короче;)
2.[ $(ls -A your/directory) ]
if [ "$(ls -A your/dir)" ]; then
echo not empty
else
echo empty
fi
или
[ "$(ls -A your/dir)" ] && echo not empty || echo empty
Аналогично Michael Berkowski и gpojd ответов.Но здесь мы не требуем трубку до wc
.См. Также Проверка Bash Shell, является ли каталог пустым от nixCraft (2007).
3.(( ${#files} ))
files=$(shopt -s nullglob dotglob; echo your/dir/*)
if (( ${#files} )); then
echo not empty
else
echo empty or does not exist
fi
Внимание: как написано в этом примере выше, нет разницы между пустым каталогом и несуществующим.
Этот последний ответ был вдохновлен Ответ Бруно де Фрейна и отличные комментарии от teambob .