Как это работает
Создайте список имен файлов:
grep -ilr --exclude=revar.sh --exclude=README.md "[DATE]" *
Рекурсивно ищите (-r) файлы и перечисляйте (-l) имена тех, где содержимое файла соответствует регистронезависимому (-i) регулярному выражению '[DATE]' (что означает, что файл содержит любой из 8 символов "AaDdEeTt"); исключить имена revar.sh и README.md, и
Удалите все имена файлов из списка, которые содержат символ, за которым следует "git" (поэтому имя файла "агитатор" будет удалено):
grep -v .git
Обрабатывайте файлы по одному, применяя к файлу определенный скрипт sed. В современных обозначениях (POSIX - и MacOS X, и Linux, AIX, HP-UX, Solaris и т.д.):
xargs -I@ sed -i "s/\[DATE\]/${today}/g" @
Параметр '-i' для 'sed' означает перезапись входных файлов после обработки. Это расширение GNU и BSD для sed, не указанное в стандарте POSIX.
Что в этом неправдоподобного
Этот сценарий можно критиковать на многих уровнях.
- Первая строка поиска неверна; он должен иметь обратную косую черту перед скобками; большинство файлов содержат хотя бы одну из букв «dateDATE».
- Второй grep предположительно предназначен для удаления чего-либо из каталогов .git и нуждается в исправлении.
- Команда «sed» не учитывает регистр при поиске «[DATE]», в отличие от первого «grep».
Как это исправить
Итак, одна из двух альтернатив имеет смысл.
Или:
grep -ilr --exclude=revar.sh --exclude=README.md "\[DATE\]" * |
grep -v '\.git/' |
xargs sed -i "s/\[[Dd][Aa][Tt][Ee]\]/${today}/g"
Или же:
grep -lr --exclude=revar.sh --exclude=README.md "\[DATE\]" * |
grep -v '\.git/' |
xargs sed -i "s/\[DATE\]/${today}/g"
Как отметил Донал Феллоуз, в этом контексте нет необходимости использовать опцию «-i» или «-I» для «xargs».
Это полезно, даже когда исправлено?
Это просто оставляет меня озадаченным, насколько это полезно. В первый день все вхождения «[ДАТА]» сопоставляются с «2010-04-17»; что происходит на следующий день? Как вы снимаете карты с дат, прежде чем вносить в репозиторий git?
Тем не менее, по крайней мере, теперь вы знаете, что он делает и как он это делает.