Ответ 1
Вы можете проверить наличие файла с чем-то вроде:
if [[ -f x.txt ]] ; then
echo file exists.
fi
Чтобы выйти, если этого не произойдет, достаточно:
if [[ ! -f x.txt ]] ; then
echo 'File "x.txt" is not there, aborting.'
exit
fi
-f <file>
- это только одно из многих условных выражений, которые вы можете использовать. Если вы посмотрите на bash
man-страницу в разделе CONDITIONAL EXPRESSIONS
, вы увидите весь их массив.
Если (как указано в обновлении вопроса) вы хотите проверить, приводит ли подстановочный знак к файлам, вы можете просто расширить его, отбросив ошибки. Если их нет, вы получите пустую строку, которая может быть обнаружена с помощью -z
:
if [[ -z "$(ls -1 */*.txt 2>/dev/null | grep ab1)" ]] ; then
echo 'There are no "*/*.txt" files.'
exit
fi
Обратите внимание, что я использовал -1
для принудительного создания одного файла на строку, хотя Linux ls
делает это по умолчанию, если устройство вывода не является терминалом (из памяти). Это на всякий случай, если вы попробуете это на машине, которая в этом случае не будет заставлять одну строку.
Имейте в виду, что если у вас есть пробелы в именах файлов, использование ls
и затем awk
для извлечения столбца 1 не будет работать слишком хорошо. Например, файл abc ab1.txt
приведет к извлечению только бит abc
.
Использование find
с -print0
, в сочетании с xargs
с -0
является обычным способом правильной обработки файлов, которые могут иметь в них "специальные" символы. Существует много других опций, которые вы можете предоставить find
для обеспечения обработки только необходимых файлов, таких как -maxdepth
, чтобы ограничить скорость перемещения по дереву каталогов и -name
, чтобы правильно фильтровать имена файлов.
Однако, если вы знаете, что у вас никогда не будет таких типов файлов, вероятно, хорошо использовать решение ls
, просто убедитесь, что вам комфортно с его недостатками.