В самом grep
нет возможности сопоставлять файлы с помощью регулярного выражения.
У вас есть два варианта:
Использовать шелл-глобус, например
grep -e '9' b*
Вышеупомянутый пример очень простой, но вы можете сопоставлять действительно причудливые имена файлов, особенно если вы используете некоторые из механизмов расширения. Ниже приведен список некоторых полезных функций bash
, которые можно включить, аналогичные можно найти в zsh
и, возможно, в других оболочках :
globstar
(использует **
для соответствия всему дереву каталогов)nocaseglob
(случай -нечувствительное совпадение)extglob
(расширенные шаблоны :?()
, @()
, !()
, *()
,+()
)nullglob
(не соответствующие -шаблоны расширяются до нулевой строки)Используйте find
для поиска файлов и выполнения grep
из них:
find. -name 'b*' -exec grep '9' {} +
или если требуется регулярное выражение:
find. -regex './b.*' -exec grep '9' {} +
Преимущество этого метода в том, что вы можете добавить другие переключатели к find
для выбора файлов не только по имени, но и по дате, размеру и т.д. Это невозможно сделать со стандартными глобусами оболочки, если вы не используете zsh
и его мощные квалификаторы glob .
По умолчанию по крайней мере time
в моем Debian выводит в stderr, что не очень хорошо использовать его в подстановке команд. Хотя в вашей команде вы указываете печатать на /dev/tty
прямо на терминал, что также не работает.
Скажите ему печатать на /dev/stdout
вместо:
t=$(/usr/bin/time -f "%e" -o /dev/stdout sleep 1)
echo "that took $t s"
или, с перенаправлением в оболочке:
t=$(/usr/bin/time -f "%e" sleep 1 2>&1)