Я хочу проверить, содержит ли / my / dir / файлы * .gz и ничего больше.
Используйте find
вместо глобуляции. На самом деле проще использовать find
и анализировать результаты поиска. Глобализация проста для простых сценариев, но как только вы захотите проанализировать «все файлы в каталоге» и выполнить некоторую фильтрацию и тому подобное, гораздо проще (и безопаснее) использовать find
:
find "$1" -mindepth 1 -maxdepth 1 \! -name '*.gz' -o \! -type f | wc -l | xargs test 0 -eq
Это находит все «вещи», которые не имеют названия *.gz
внутри каталога или не являются файлами (поэтому учитывается mkdir a.gz
), подсчитывает их, а затем проверяет, равно ли их количество 0. Если число равно 0, xargs test 0 -eq
вернет 0, если нет, то вернет статус между 1 - 125
. Вы можете обработать ненулевой статус возврата простым || return 1
, если хотите.
Вы можете удалить xargs
с помощью простой подстановки bash и использовать метод из this thread для небольшого ускорения и получить test
возвращаемое значение, равное 0
или 1
:
[ 0 -eq "$(find "$1" -mindepth 1 -maxdepth 1 \! -name '*.gz' -o \! -type f -print '.' | wc -c)" ]
Помните, что статус выхода скрипта - это статус выхода последней выполненной команды. Так что вам больше ничего не нужно в вашем сценарии, если хотите, только шебанга и этого единственного лайнера будет достаточно.