Bash One Liners #6
Para quem utiliza um sistema de controle de versões, sempre há aquele momento em que você criou alguns arquivos (às vezes vários), e o repositório ainda não os têm sob controle, fazendo com que você precise adicioná-los um a um, caso não utilize uma IDE. Este é o caso, pelo menos, com o Subversion e com o CVS (que são os que conheço melhor). No Subversion, por exemplo, para verificar quais arquivos da cópia local ainda não foram adicionados ao repositório é só fazer:
svn status | grep '^?'
Esse é o início do one liner deste artigo. Digamos que a saída fosse a seguinte:
? b.txt
? c.txt
? a.txt
O objetivo aqui é, com um one liner, adicionar todos esses arquivos ao Subversion,
ou seja, aplicar o comando svn add sobre cada um deles. Naturalmente, o próximo
passo é recortar essa saída, descartando a primeira coluna inteira, e nos deixando
com a segunda, que é a lista dos arquivos ainda não adicionados. Poderíamos utilizar
o cut para realizar o corte, mas a opção -d do comando aceita um único caracter
(e neste caso o delimitador seria 1 ou mais espaços em branco).
Logo, precisamos de um programa mais robusto: awk:
svn status | grep '^?' | awk '{ print $2 }'
Como o delimitador padrão do awk é 1 ou mais espaços, a tarefa tornou-se
muitos simples. Agora nossa saída se transformou em:
b.txt
c.txt
a.txt
Em seguida utilizamos o xargs, que irá inserir a string “svn add” no
início de cada uma dessas linhas e passá-las ao Bash como um conjunto
de comandos montar um comando único na forma svn add linha1 linha2 ... linhaN.
svn status | grep '^?' | awk '{ print $2 }' | xargs svn add
E o resultado do próximo svn status:
A b.txt
A c.txt
A a.txt
Há uma limitação para esse one liner: se um dos arquivos possuísse espaços em branco
no nome, então o comando awk removeria todos os caracteres que aparecem após
o primeiro espaço em branco. Não sei como alterar o programa awk para contornar
esse problema e e ao mesmo tempo mantê-lo como um programa de um único comando, portanto
vou marcar esse bug como won’t fix
(se alguém souber, por favor, deixe um comentário que atualizarei o post).
