новое десятилетие: как произнести что-то вроде `find /path/ -name 'file.20{19,20}*'` (но это работает)

Версия, которая должна работать в любой оболочке POSIX, а не толькоbash:

printf '%s\n' "${a%?} ${a#"${a%?}"}"

Дополнительные кавычки внутри ${a#...}предназначены для защиты от специальных символов из переменной:

$ a='10*M'; printf '%s\n' "${a%?} ${a#"${a%?}"}"
10* M

Без них второе раскрытие переменной превратилось бы в ${a#10*}, а вместо этого было бы отображено 10* *M.

3
15.01.2020, 07:43
2 ответа

С помощью 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... {} +ведет себя так же, короче и более переносим.

12
27.01.2020, 21:07

Это не общий ответ на ваш вопрос, но может быть простой способ сделать это в зависимости от того, сколько у вас файловой истории. Я часто сталкивался с подобной ситуацией с месяцами, когда искал вещи в сентябре/октябре. Одним из простых обходных путей является использование такого шаблона:

file.20[12][90]*

Он не идентичен, потому что помимо 2019 и 2020 годов, он также будет соответствовать 2010 и 2029 годам. Предположительно, у вас еще нет файлов, датированных 2029 годом. Если ваш архив не восходит к 2010 году, тогда этот должны быть функционально эквивалентны.

0
27.01.2020, 21:07

Теги

Похожие вопросы