[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [shell-script] Percorrendo uma lista com duplas de arquivos
From: |
Marcio Gil |
Subject: |
Re: [shell-script] Percorrendo uma lista com duplas de arquivos |
Date: |
Wed, 11 Aug 2010 17:27:53 -0300 |
User-agent: |
Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.9.2.8) Gecko/20100802 Thunderbird/3.1.2 |
Em 11/8/2010 10:26, Julio C. Neves escreveu:
Fala Marcio,
será que o xargs com -n2 ou -L2 não resolveria o seu problema sem loop?
Funciona de certa forma:
$ xargs -n2 diff -q <iguais.lst
Os arquivos Projeto1/subdir1/arquivo2.cpp e
Projeto2/subdir1/arquivo2.cpp são diferentes
Os arquivos Projeto1/subdir3/arquivo4.cpp e
Projeto2/subdir3/arquivo4.cpp são diferentes
$ xargs -L1 diff -q <iguais.lst
Os arquivos Projeto1/subdir1/arquivo2.cpp e
Projeto2/subdir1/arquivo2.cpp são diferentes
Os arquivos Projeto1/subdir3/arquivo4.cpp e
Projeto2/subdir3/arquivo4.cpp são diferentes
Aproveito para tirar algumas dúvidas a respeito do 'xargs'.
O questão é, e se eu quiser executar alguma ação quando os arquivos
forem diferentes, como jogar a linha para um arquivo. Poderia remover
com 'sed' as palavras do 'diff', só não ficaria portável. Mas tem como
executar algo mais complexo com o 'xargs', com dois comandos? Exemplo:
$ xargs -I{} -n2 "diff -q {} || echo {} >dif.lst" <iguais.lst
Mas não funciona pois o {} não funciona com -n2 ou -L1 e o xargs pensa
que "diff -q {} || echo {} >dif.lst" é todo um nome de arquivo.
Outra coisa que costumo fazer com frequência:
$ xargs -n2 vimdiff <iguais.lst
Utilizando o laço 'for', se eu quiser interromper no meio eu teclo
"CTRL+Z", depois digito "fg" e quando saio do editor o laço é
interrompido. Com xargs eu preciso dar um 'kill' pois não funciona,
existe uma maneira melhor?
Tem um exemplo muito parecido com o que vc quer na minha página (
www.julioneves.com), no link "Tira Gosto"
Abração,
Julio
Cursos de Shell e Zenity em 2 fins de semana?
- SE turma de Shell/Zenity em 13/09 - address@hidden
- SP turma de Shell em 14/08 - www.4Linux.com.br
<http://www.4linux.com.br/>
- Turmas fechadas em outras cidades ligue (21)8112-9988.
--- @ WiseStamp
Signature<http://my.wisestamp.com/link?u=63n3xfgzns9kh5v7&site=www.wisestamp.com/email-install>.
Get it
now<http://my.wisestamp.com/link?u=63n3xfgzns9kh5v7&site=www.wisestamp.com/email-install>
Em 11 de agosto de 2010 09:54, Marcio Gil<address@hidden> escreveu:
A uns tempos atrás eu postei aqui no grupo o seguinte script:
http://bash.pastebin.com/jjfUPuAp
Hoje eu estava tentando comparar dois projetos para ver quais
arquivos existem com o mesmo nome que diferem no conteúdo, então eu
rodei esta linha:
$redund -n Projeto1/ Projeto2/>iguais.lst
e obetive um resultado como esse:
Projeto1/arquivo1.cpp Projeto2/arquivo1.cpp
Projeto1/subdir1/arquivo2.cpp Projeto2/subdir1/arquivo2.cpp
Projeto1/subdir2/arquivo3.cpp Projeto2/subdir2/arquivo3.cpp
Projeto1/subdir3/arquivo4.cpp Projeto2/subdir3/arquivo4.cpp
Ou seja, dois nomes de arquivo por linha. Agora eu quero percorrer
esta lista para, por exemplo, comparar os arquivos que diverem.
Tentei desta forma:
IFS=$'\n'
for f in `<iguais.lst` ; do diff -q $f ; done
Mas não dá certo pois ele não interpreta o $f como dois arquivos,
mas como um.
Também poderia gerar uma lista de arquivos idênticos (mesmo conteúdo)
com "redund -i" e subtrair o segundo conjunto do primeiro, mas ainda
assim eu precisaria percorrer o resultado com descrevi.
Obrigado.
Marcio Gil.