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

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

Eu sei que posso comparar recursivamente dois diretórios diff -qre gerar apenas as diferenças. No entanto, isso parece comparar as posições dos arquivos nas árvores (por exemplo, /a/b/file01 != /b/c/file01).

Quero comparar duas árvores diferentes e resultar apenas em arquivos exclusivos (independentemente de sua posição na árvore). Portanto, no exemplo acima, file01seria considerado uma correspondência. Isso é possível diffou preciso fazer um findloop aninhado e percorrer cada um deles?

Responder1

Eu usaria findalgumas travessuras:

Digamos que os dois caminhos sejam /a e /b:

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

Portanto, isso é "encontrar todos os arquivos em/a e/b e gerar seus nomes de base (ou seja, caminho removido), classificá-los e gerar quaisquer valores exclusivos na lista".

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

for i in `find /a/ /b/ -exec basename \{} \; | sort | uniq -u`; do find /a/ /b/ -name $i; done

Responder2

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

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

(Isso precisa ser elaborado para permitir múltiplas ou nenhuma instância tree2de cada arquivo de tree1e para espaços em branco incorporados.)

O que você pode fazer para acelerar é salvar a lista de arquivos tree2primeiro:

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.

informação relacionada