O gnu diff pode comparar recursivamente apenas nomes de arquivos em diferentes estruturas de pastas?

0

Eu sei que posso comparar recursivamente dois dirs com diff -qr e gerar apenas as diferenças. No entanto, isso parece comparar posições de arquivos nas árvores (por exemplo, /a/b/file01 != /b/c/file01 ).

Eu quero comparar duas árvores diferentes e resultar em arquivos únicos (independentemente de sua posição na árvore). Portanto, no exemplo acima, file01 seria considerado uma correspondência. Isso é possível com diff , ou eu tenho que fazer um loop find aninhado e percorrer cada um deles?

    
por kiwisan 28.10.2014 / 00:18

2 respostas

1

Eu usaria find e alguns shenanigans:

Vamos dizer que os dois caminhos são / ae / b:

find /a/ /b/ -exec basename \{} \; | sort | uniq -u

Portanto, "localize todos os arquivos em / a e / b e exiba seus nomes básicos (ou seja, o caminho removido), classifique-os e, em seguida, emita quaisquer valores exclusivos na lista".

Se você quiser encontrar onde esses arquivos estão nos diretórios, podemos agrupar tudo e encontrá-los:

for i in 'find /a/ /b/ -exec basename \{} \; | sort | uniq -u'; do find /a/ /b/ -name $i; done
    
por 28.10.2014 / 00:48
1

Eu não acho que seja possível com diff . Eu presumo que você esteja pensando em algo do tipo:

find tree1 -type f | while f='line' ; do diff $f 'find tree2 -type f -name "${f##*/}"'; done

(Isso precisa ser elaborado para permitir várias ou nenhuma instância em tree2 de cada arquivo de tree1 e para espaços em branco incorporados.)

O que você pode fazer para acelerar é salvar a lista de arquivos em tree2 primeiro:

find tree2 -type f >tree2.list
find tree1 -type f | while f='line' ; do diff $f 'grep <tree2.list "/${f##*/}$"'; done

Isso significa que, para cada arquivo, em vez de pesquisar uma hierarquia de diretórios, apenas um único arquivo é verificado.

    
por 28.10.2014 / 01:22