Использование find
может быть хорошим выбором здесь:
#!/bin/sh
res=
res=$(find . -maxdepth 1 -name '*.txt' -type f -print -quit)
[ -n "$res" ] || echo 'Not found!'
, который может быть сокращен до:
#!/bin/sh
[ -n "$(find . -maxdepth 1 -name '*.txt' -type f -print -quit)" ] || echo 'Not found!'
Преимущество этого в том, что нет оболочки шариков , и find
завершает работу, как только *.txt
файл найден. Вы не получите Список аргументов слишком длинный ошибок, если их слишком много .txt
файлов, и в этом случае это будет быстрее.
Кроме того, с -type f
мы уверены, что имеем дело только с файлами. Многие ответы, связанные с глобусами, потерпят неудачу, если нет файлов .txt
, но каталог по имени whatever.txt
.
Как @chepner состояний в комментарии (спасибо!), -maxdepth
и -quit
не определены POSIX, так что это решение не является портативным (-printf
не определен POSIX либо, но это тривиально исправить, чтобы заменить -printf
по -print
).
Чтобы зафиксировать переключатель -quit
, мы будем использовать grep
следующим образом:
find . -name '*.txt' -type f | grep -q . || echo 'Not found!'
Как только grep
считывает символ, он выходит, закрывая трубку и find
уйдет тоже. Это будет рекурсивно в подкаталогах (это может быть желаемое поведение).
В противном случае, если вы не хотите рекурсии:
find . -type d \! -name . -prune \! -type d -o -name '*.txt' -type f | grep -q . || echo 'Not found!'
Имейте в виду, что '-printf' и' -maxdepth' не являются частью стандарта POSIX для 'find', если вам нужно, чтобы это было полностью переносимым. – chepner
@чепнер спасибо! пост отредактирован соответствующим образом. –