Como isso funciona exatamente
-
Gere uma lista de nomes de arquivos:
grep -ilr --exclude=revar.sh --exclude=README.md "[DATE]" *
Pesquise recursivamente (-r) para arquivos e liste (-l) os nomes daqueles em que o conteúdo do arquivo corresponde insensivelmente a maiúsculas e minúsculas (-i) a regex '[DATE]' (o que significa que o arquivo contém qualquer um dos 8 caracteres "AaDdEeTt"); exclua os nomes revar.sh e README.md e
-
Remova quaisquer nomes de arquivos da lista que contenham um caractere seguido por 'git' (assim o nome do arquivo 'agitator' será removido):
grep -v .git
-
Processe os arquivos um de cada vez, aplicando um script 'sed' específico ao arquivo. Na notação moderna (POSIX - e MacOS X e Linux, AIX, HP-UX, Solaris, etc):
xargs -I@ sed -i "s/\[DATE\]/${today}/g" @
A opção '-i' para 'sed' significa sobrescrever o (s) arquivo (s) de entrada após o processamento. Esta é uma extensão GNU e BSD para 'sed' não especificada no padrão POSIX.
O que é implausível nisso
Esse script pode ser criticado em vários níveis.
- A primeira string de pesquisa está incorreta; deve ter barras invertidas antes dos colchetes; a maioria dos arquivos contém pelo menos uma das letras 'dateDATE'.
- O segundo grep é presumivelmente destinado a remover qualquer coisa sob os diretórios '.git' e precisa ser corrigido.
- O comando 'sed' não faz distinção entre maiúsculas e minúsculas ao procurar por '[DATE]', diferente do primeiro 'grep'.
Como corrigir isso
Então, uma das duas alternativas faz sentido.
Ou:
grep -ilr --exclude=revar.sh --exclude=README.md "\[DATE\]" * |
grep -v '\.git/' |
xargs sed -i "s/\[[Dd][Aa][Tt][Ee]\]/${today}/g"
Ou:
grep -lr --exclude=revar.sh --exclude=README.md "\[DATE\]" * |
grep -v '\.git/' |
xargs sed -i "s/\[DATE\]/${today}/g"
Como o Donal Fellows observou, não há necessidade neste contexto de usar a opção '-i' ou '-I' para 'xargs'.
É útil mesmo quando corrigido?
Isso me deixa intrigado sobre como isso é útil. No primeiro dia, todas as ocorrências de '[DATE]' são mapeadas para '2010-04-17'; o que acontece no dia seguinte? Como você desmapear as datas antes de confirmar o repositório git?
Ainda assim, pelo menos você já sabe o que faz e como faz isso.