Bash существует несколько тестовых файлов

Как я могу использовать команду test для произвольного количества файлов, переданных в аргументе regexp

например:

test -f /var/log/apache2/access.log.* && echo "exists one or more files"

но ошибка печати ниже: bash: test: слишком много аргументов

Ответ 1

Чтобы избежать "слишком много ошибок аргументов", вам нужны xargs. К сожалению, test -f не поддерживает несколько файлов. Следующий однострочный лайнер должен работать:

for i in /var/log/apache2/access.log.*; do test -f "$i" && echo "exists one or more files" && break; done

BTW, /var/log/apache2/access.log.* называется shell-globbing, а не регулярным выражением, пожалуйста, проверьте следующее: Путаница с подстановочными знаками оболочки и Regex.

Ответ 2

Это решение кажется мне более интуитивным:

if [ `ls -1 /var/log/apache2/access.log.* 2>/dev/null | wc -l ` -gt 0 ];
then
    echo "ok"
else
    echo "ko"
fi

Ответ 3

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

SRC=`find src -name "*.java"`
if [ ! -z $SRC ]; then
    javac -classpath $CLASSPATH -d obj $SRC
    # stop if compilation fails
    if [ $? != 0 ]; then exit; fi
fi

Ответ 4

Сначала сохраните файлы в каталоге как массив:

logfiles=(/var/log/apache2/access.log.*)

Затем выполните тест по счету массива:

if [[ ${#logfiles[@]} -gt 0 ]]; then
  echo 'At least one file found'
fi

Ответ 5

ls -1 /var/log/apache2/access.log.* | grep . && echo "One or more files exist."

Ответ 6

Вам просто нужно проверить, есть ли у ls список:

ls /var/log/apache2/access.log.* >/dev/null 2>&1 && echo "exists one or more files"

Ответ 7

Изменение темы:

if ls /var/log/apache2/access.log.* >/dev/null 2>&1
then 
  echo 'At least one file found'
else
  echo 'No file found'
fi