Три лучших трюка
shopt -s nullglob dotglob; f=your/dir/*; ((${#f}))
Этот трюк на 100% bash
и вызывает (порождает) суб-оболочку. Идея взята из Bruno De Fraine и улучшена комментарием teambob .
files=$(shopt -s nullglob dotglob; echo your/dir/*)
if (( ${#files} ))
then
echo "contains files"
else
echo "empty (or does not exist or is a file)"
fi
Примечание: нет разницы между пустым каталогом и несуществующим (даже если указанный путь является файлом).
Существует аналогичная альтернатива и более подробная информация (и другие примеры) в «официальных» FAQ для #bash IRC канала :
if (shopt -s nullglob dotglob; f=(*); ((${#f[@]})))
then
echo "contains files"
else
echo "empty (or does not exist, or is a file)"
fi
[ -n "$(ls -A your/dir)" ]
Этот трюк основан на статье nixCraft , опубликованной в 2007 году. Добавьте 2>/dev/null
, чтобы подавить ошибку вывода "No such file or directory"
.
См. Также ответ Эндрю Тейлора (2008) и gr8can8dian (2011).
if [ -n "$(ls -A your/dir 2>/dev/null)" ]
then
echo "contains files (or is a file)"
else
echo "empty (or does not exist)"
fi
или версия однострочного bashism:
[[ $(ls -A your/dir) ]] && echo "contains files" || echo "empty"
Примечание: ls
возвращает $?=2
, когда каталог не существует. Но нет разницы между файлом и пустой директорией.
[ -n "$(find your/dir -prune -empty)" ]
Этот последний трюк основан на ответе gravstar , где -maxdepth 0
заменен -prune
и улучшен комментарием phils .
if [ -n "$(find your/dir -prune -empty 2>/dev/null)" ]
then
echo "empty (directory or file)"
else
echo "contains files (or does not exist)"
fi
вариант с использованием -type d
:
if [ -n "$(find your/dir -prune -empty -type d 2>/dev/null)" ]
then
echo "empty directory"
else
echo "contains files (or does not exist or is not a directory)"
fi
Объяснение:
find -prune
аналогично find -maxdepth 0
с использованием меньшего количества символов
find -empty
печатает пустые каталоги и файлы
find -type d
печатает только каталоги
Примечание: Вы также можете заменить [ -n "$(find your/dir -prune -empty)" ]
только сокращенной версией ниже:
if [ `find your/dir -prune -empty 2>/dev/null` ]
then
echo "empty (directory or file)"
else
echo "contains files (or does not exist)"
fi
Этот последний код работает в большинстве случаев, но имейте в виду, что вредоносные пути могут выражать команду ...