Bash One Liners #6

Em: 01/08/2008 Tags: , , , , , Referencie do seu blog (Trackback)

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).

Artigos relacionados:

Escreva um comentário (utilize o formato Markdown)