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