Como crio uma lista de arquivos modificados programaticamente usando as ferramentas de linha de comando do linux? Não estou interessado na diferença em nenhum arquivo em particular (delta, patch). Eu só quero ter uma lista de arquivos novos ou modificados em comparação com o lançamento anterior do produto. Para que eu possa publicar uma nova atualização do produto.
update: diff -qr
não produz resultados muito convenientes. A saída de diff -qr
também precisa ser processada. Existe alguma maneira melhor?
linux
bash
command-line
diff
Alpha Sísifo
fonte
fonte
Respostas:
Eu tenho uma abordagem simples para isso: Use o modo de pré-visualização rsync:
Os arquivos que são mostrados como "a serem excluídos" por esse comando serão os "novos" arquivos. Os outros que serão transferidos mudaram de alguma maneira. Veja a página rsync-man para mais detalhes.
fonte
Você pode usar o diff toool: veja as opções -q e -r
Exemplo:
fonte
Only in
que aparece mesmo que os diretórios sejam cópias ideais. Precisava comparar as alterações com uma revisão antiga e acabar fazendo o download da revisão inteira em um diretório separado e usando as ferramentas SVN padrão para comparar. Isso parece ser a única maneira de ir ...O
diffutils
pacote inclui umalsdiff
ferramenta. Apenas passe a saída dediff -u
para lsdiff:fonte
patchutils
pacote para mim (CentOS 5.x).Eu apenas tocava em um arquivo no momento de cada atualização e, em seguida, você pode encontrar os arquivos que foram modificados desde então com
find /tree/location -newer /last/update/file -print
fonte
Para pegar apenas o nome dos arquivos que eles mudaram, eu uso este comando:
Se precisar excluir alguns arquivos como arquivos de objeto ou de biblioteca, você pode usar:
fonte
Para criar uma lista de arquivos novos ou modificados de forma programática, a melhor solução que eu poderia encontrar é usar rsync , sort e uniq :
Deixe-me explicar com este exemplo: queremos comparar dois lançamentos dokuwiki para ver quais arquivos foram alterados e quais foram criados recentemente.
Buscamos os alcatrões com o wget e os extraímos nos diretórios
old/
enew/
:A execução do rsync de uma maneira pode perder os arquivos recém-criados, como mostra a comparação do rsync e do diff aqui:
produz a seguinte saída:
A execução do rsync apenas em uma direção perde os arquivos recém-criados e, ao contrário, os arquivos excluídos são comparados, compare a saída do diff:
produz a seguinte saída:
Executar o rsync nos dois sentidos e classificar a saída para remover duplicatas revela que o diretório
data/pages/playground/
e o arquivodata/pages/playground/playground.txt
foram perdidos inicialmente:produz a seguinte saída:
rsync
é executado com estes argumentos:-r
"recursar em diretórios",-c
para comparar também arquivos de tamanho idêntico e apenas "pular com base na soma de verificação, não no tempo e tamanho da modificação",-n
para "executar uma avaliação sem alterações feitas" e--out-format="%n"
para "gerar atualizações usando o FORMAT especificado", que é "% n" aqui apenas para o nome do arquivoA saída (lista de arquivos) de
rsync
ambas as direções é combinada e classificada usandosort
, e essa lista classificada é então condensada removendo todas as duplicatas comuniq
fonte
Você deve obter o resultado desejado usando:
fonte
Isso pode fazer o truque:
fonte
Normalmente, você coloca os arquivos em algum tipo de sistema de controle de versão, como SubVersion ou git, pois eles podem fazer isso por você imediatamente.
Mas você pode fazer um script rápido com um loop for no dir1 e depois comparar todos os arquivos com o do dir2. O loop for pode olhar o código de saída do diff para saber se os arquivos eram diferentes.
Talvez algo parecido com isto:
Nota: O script não é testado, portanto, o exemplo acima é "pseudocódigo inspirado no bash" ...
Vamos dar outra chance, mas com git
Crie alguns arquivos de exemplo para brincar
Em seguida, insira o dir e importe o dir1
Saia e modifique dir1 (para que se torne seu dir2)
Então entre no diretório git e importe o novo diretório
Agora pergunte ao git o que mudou (com o comando status)
A saída é uma lista com as alterações, que se parece com isso:
fonte
Talvez você esteja mais feliz com algo diferente. Tente
git
.Faça isso como um exemplo:
git
rastreará seus arquivos para você. O comandogit status
mostrará todos os arquivos que foram modificados desde a última confirmação.fonte
Isso é semelhante ao rsync: show quando um arquivo mais recente no destino deve ser substituído (solicitado mais tarde, embora não seja um duplicado).
Conforme indicado na pergunta, "diff -q -r" pode exigir algum processamento para ser útil. A questão não especificou a forma da saída; as respostas fornecem diferentes tipos de relatórios.
rsync
é uma ferramenta útil para esse fim, porque é muito mais rápido quediff
. No entanto, a solução sugerida por @nils é muito mais detalhada (e lista mais arquivos) do que as diferenças reais entre as antigas / novas árvores de diretório. Por exemplo, comparando isso com o script que escrevi para essa resposta e executando nos mesmos dados,Para
diff
explicar adequadamente os novos arquivos, você também precisa da-N
opção (que não vejo em nenhuma das respostas sugeridas). No entanto, como é muito mais lento (ordens de magnitude) do quersync
melhorar o resultado deste último parece o caminho a percorrer.Leitura adicional
fonte
Eu sempre fui parcial em relação ao sha1sum (ou até ao md5sum; nesse contexto, é bastante seguro).
Às vezes - como se você tiver muitos arquivos sendo renomeados ou movidos - a classificação no primeiro campo e a execução do diff podem ajudar, mas na maioria das vezes isso é bom o suficiente.
Observe que, comparado a alguns dos outros métodos, isso tem a vantagem de que você não precisa manter uma cópia dos arquivos "anteriores"; somente o arquivo de saída md5sum.
fonte