Eis um problema que já tive que enfrentar diversas vezes: alterar um parâmetro de configuração que não sabia onde estava! Ou ainda: investigar o que foi alterado em algo que antes funcionava e passou a dar problema.
Como na informática tudo gira em torno de 0s e 1s, se algo mudou, tem que haver diferença entre arquivos e ou diretórios. Digamos que você possua dois diretórios contendo parâmetros de configuração de determinado software. Um deles funciona, o outro não. Como saber o que há de diferente entre eles?
Richard Stallman, junto com outros colaboradores da GNU nos proveu o utilitário diff no Linux (ou melhor, GNU/Linux), o qual permite a comparação entre dois arquivos de texto ou binários. O problema é que esse comando precisa ser invocado para cada par de arquivos, o que pode se tornar um complexo "trabalho de estagiário" dependendo da quantidade de subdiretórios e arquivos considerados.
Para atacar essa questão, criei o script em Shell diffdirs.sh contendo o código a seguir:
#!/bin/bash if [ $# -ne 2 ] then echo "Uso: $0 <dir1> <dir2>" exit 1 fi dir1="$1" dir2="$2" list="/tmp/$$.list" cont="/tmp/$$.cont" cd $dir1 find -type f | sed 's/^\.\///' > $list cd - > /dev/null echo "Analisando diferenças entre diretórios:" echo "- $dir1" echo "- $dir2" while read arq do if ! diff $dir1/$arq $dir2/$arq > $cont then echo -e "\n$arq:" cat $cont fi done < $list rm -f $list $cont exit 0
No caso em questão, precisava saber em qual diretório e arquivo residia uma configuração específica da IDE Eclipse. Como não dispunha de ambiente gráfico, a opção foi fazer tudo em modo texto. E esse script resolveu o problema! Veja o resultado exibido após a sua execução:
$ ./diffdirs.sh Uso: ./diffdirs.sh <dir1> <dir2> $ ./diffdirs.sh ws35a/ ws35b/
Analisando diferenças entre diretórios: - ws35a - ws35b .metadata/.plugins/org.eclipse.jdt.core/nonChainingJarsCache: Os arquivos binários ws35a/.metadata/.plugins/org.eclipse.jdt.core/nonChainingJarsCache e ws35b/.metadata/.plugins/org.eclipse.jdt.core/nonChainingJarsCache são diferentes .metadata/.plugins/org.eclipse.core.runtime/.settings/org.maven.ide.eclipse.prefs: 1c1 < #Tue Dec 21 09:47:38 AMT 2010 --- > #Tue Dec 21 09:48:27 AMT 2010 3d2 < eclipse.m2.downloadSources=true 10d8 < eclipse.m2.downloadJavadoc=true
Agora é só copiar o script para um diretório no PATH do usuário. :D