Версия, которая должна работать в любой оболочке POSIX, а не толькоbash
:
printf '%s\n' "${a%?} ${a#"${a%?}"}"
Дополнительные кавычки внутри ${a#...}
предназначены для защиты от специальных символов из переменной:
$ a='10*M'; printf '%s\n' "${a%?} ${a#"${a%?}"}"
10* M
Без них второе раскрытие переменной превратилось бы в ${a#10*}
, а вместо этого было бы отображено 10* *M
.
С помощью zsh
вы можете использовать рекурсивную подстановку и ее <x-y>
оператор подстановки, который соответствует диапазонам десятичных чисел:
grep -nHFe 'text I seek' /path/**/file.<2019-2020>*(D-.)
(чтобы (D)
также заглянуть в скрытые(D
и )каталоги, как это сделал бы find
;по-видимому, вы можете опустить его, если они вам не нужны, а -.
означает ограничение обычным файлом (.
), идентифицированным после разрешения символической ссылки(-
)).
Обратите внимание, что он также будет соответствовать file.00002020
(, так как это десятичное число между 2019 и 2020 ), и, как и в вашем подходе к file.20201234
, так как его file.2020
, который соответствует file.<2019-2020>
, за которым следует 1234
, который соответствует *
.
Стандартный (POSIX sh
и утилиты )способ сделать это с помощью:
find /path \( -name 'file.2019*' -o -name 'file.2020*' \) -type f \
-exec grep -Fne 'text I seek' /dev/null {} +
(где добавление /dev/null
дает вам тот же эффект, что и GNU grep
-H
для принудительного отображения имени файла)
Обратите внимание, что выходные данные find -print
несовместимы с ожидаемым входным форматом xargs
. С утилитами GNU вы можете использовать find -print0
и xargs -r0
, но это не обязательно, так как find -exec... {} +
ведет себя так же, короче и более переносим.
Это не общий ответ на ваш вопрос, но может быть простой способ сделать это в зависимости от того, сколько у вас файловой истории. Я часто сталкивался с подобной ситуацией с месяцами, когда искал вещи в сентябре/октябре. Одним из простых обходных путей является использование такого шаблона:
file.20[12][90]*
Он не идентичен, потому что помимо 2019 и 2020 годов, он также будет соответствовать 2010 и 2029 годам. Предположительно, у вас еще нет файлов, датированных 2029 годом. Если ваш архив не восходит к 2010 году, тогда этот должны быть функционально эквивалентны.