terça-feira, 1 de abril de 2008

Problema de conjuntos resolvido com ferramentas do Linux

Essa experiência foi suscitada a partir de uma questão prática: Um dia enviei um tarball do meu diretório de wallpapers pro meu amigo Sryche (Cainã Costa). Depois, acrescentei outras wallpapers no mesmo diretório. O problema é que o Sryche novamente me pediu wallpapers, mas somente os que ele não tinha. Como fazer? Ele me mostrou o caminho então e aqui eu reproduzo a experiência, primeiro em tese e depois explico na prática:

Primeiro criei 1 diretório de testes com
dois dirs dentro dele:

$ mkdir -p testes/waka{1,2}

Dentro de ~/testes/waka1 criei 3 arquivos e os copiei para waka2 (eu poderia simplesmente copiar o waka1 para waka2 com outro nome, mas prefiro fazer dessa forma por conta da lógica do problema):


$ cd testes/waka1/

$ touch teste-{a,b,c} && cp teste-* ../waka2

Portanto, dentro de waka1 e waka2, o conteúdo agora era idêntico: 3 arquivos, teste-a, teste-b e teste-c.

Depois, dentro de waka1, eu criei mais 3 arquivos:

$ touch teste-{d,e,f}

Agora, o conteúdo dos dirs diferiam, pois o waka1 tinha 6 elementos e o waka2, apenas 3.

Depois, dei um $ ls ../waka2 > arg ainda dentro do dir waka1, criando um arquivo com os elementos de waka2, que me servirá mais tarde de argumento.

E finalmente no dir waka1 eu removi apenas os arquivos que eu não tinha em waka2:

$ xargs --arg-file=arg rm ;

O ls waka1 demonstrará o resultado da experiência. Só restaram, obviamente, os arquivos que não existem em waka2.

Foi assim que resolvemos o problema do envio dos wallpapers.

Na ocorrência real, eu não sabia quantos e quais os wallpapers tinham sido adicionados ao diretório (eu poderia ver pela data com ls, e com sed, grep e outros comandos, tentar resolver o problema, mas tb não sabia quando os tinha enviado). Assim, o Sryche deu um ls no diretório que ele recebeu lá e me enviou a saída por pastebin (o problema todo é que eram muitos wallpapers e na época o Sryche tinha conexão discada). Eu copiei a minha p
asta de diretórios e usando a saída do Sryche como argumento, removi todos os wallpapers que ele já tinha. O que restou, obviamente, eram os wallpapers que ele não tinha, então empacotei o diretório e disponibilizei ao Sryche com um link em um HD virtual.

A resolução do problema coube ao Sryche e estou publicando-a porque a achei simples e genial (disse a ele à época) e acho que a lógica envolvida pode ajudar mais pessoas em problemas similares.

Se vc tem uma outra maneira de resol
ver esse interessante problema só com comandos do linux, por favor, deixe-nos conhecê-la, através de um comentário!

Grande abraço a todos!


5 comentários:

Tycher Santiago (sSantiago) disse...

Ótima solução, eu só havia pensado com grep. Ela foi muito mais simples e mais rápida do que a que pensei, já que com apenas dois comandos vocês conseguiram completar o objetivo, e o linux está ai pra isso, produtividade e qualidade, deixando para nós apenas as tarefas mais nobres. :D

Smartphone disse...

Hello. This post is likeable, and your blog is very interesting, congratulations :-). I will add in my blogroll =). If possible gives a last there on my blog, it is about the Smartphone, I hope you enjoy. The address is http://smartphone-brasil.blogspot.com. A hug.

binoculars for night vision disse...
Este comentário foi removido por um administrador do blog.
Pedro disse...

Tive um problema parecido há poucos minutos: queria excluir músicas duplicadas que estavam em duas pastas.

Não deu outra, lembrei logo daqui!

Gabriel disse...

eu usuaria um diff para isso, exemplo:
gabriel@debian:~$ ls > teste.txt
gabriel@debian:~$ touch teste2
gabriel@debian:~$ ls > teste2.txt
gabriel@debian:~$ diff teste.txt teste2.txt | awk '/^>/ {print $2}'
resultado:
teste2
teste2.txt