Eu sei que posso comparar recursivamente dois diretórios diff -qr
e 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, file01
seria considerado uma correspondência. Isso é possível diff
ou preciso fazer um find
loop aninhado e percorrer cada um deles?
Responder1
Eu usaria find
algumas 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 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 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.