У меня есть скрипт, который будет загружать html файлы в текущий каталог.
Затем он сгенерирует отчет на основе этих html файлов.
Наконец, он удалит все эти html файлы.
Поэтому, когда я запускаю этот скрипт, я хочу убедиться, что в текущем каталоге нет файлов html .

Вот что я получил:

if ls *.html >/dev/null 2>&1; then
    echo 'clear HTML files first'
    exit
fi

Есть ли простой способ проверить?

3 ответа3

1

Подсчитайте количество файлов HTML (не папок, символических ссылок и т.д.) В текущем каталоге и, если оно больше нуля, прервите:

if [[ $( find . -maxdepth 1 -type f -name "*.html" | wc -l ) -gt 0 ]] ; then
    echo "Oh no, there are HTML files!" >&2
    exit 1
fi
1

Использование опции failglob ; проверяет наличие совпадений:

if (shopt -s failglob; true *.html) 2>/dev/null; then
    echo "Found files"
fi

Использование nullglob и массивов; считает файлы:

numfiles=$( shopt -s nullglob; files=(*.html); echo ${#files[@]} )

if (( numfiles > 0 )); then
    echo "Have $numfiles HTML files"
else
    echo "No files"
fi

Другой способ, без использования nullglob или сброса $files:

files=(*.html)
if [[ -e ${files[0]} ]]; then
    numfiles=${#files[@]}
    echo "$numfiles files found"
fi

Использование nullglob для всего скрипта - может быть хорошо в некоторых случаях, плохо в других:

#!/usr/bin/env bash
shopt -s nullglob

...

files=(*.html)
numfiles=${#files[@]}
1
for i in *.html
do
  if [ -f "$i" ] 
  then
     echo "Cannot run, html files in current directory"
     exit 1
  fi
done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .