Existe uma ferramenta de difusão profunda do Linux que também compara atributos de arquivo?

16

Existe uma ferramenta Linux como o diff que comparará recursivamente arquivos e diretórios, mas com a adição de também comparar: atributos estendidos, acl's, contextos se?

Michael Gantz
fonte
1
As respostas fornecidas funcionam para fazer comparações de vez em quando. Porém, eles não são adequados para fazer esses tipos de comparações muitas vezes por hora ao testar software. Eu posso estar inclinado a modificar o código-fonte diff para incluir essas comparações.
Michael Gantz

Respostas:

7

Eu fiz isso antes de usar a rsync -aHAX --deletelembrança para adicionar os sinalizadores -ne -i.

Isso é um pouco contra-intuitivo, mas tenha paciência comigo. O rsynccomando principal é o que você precisaria para sincronizar os dois diretórios juntos. Mas -n -ifaz com que NÃO seja sincronizado (ou seja, faça uma execução a seco) e apenas imprima o que teria feito e por quê. Não é fantástico analisar, mas você pode obter o nome do arquivo facilmente e canalizar para lsou similar.

Isso analisará tudo, incluindo horários, datas etc., além de não seguir os nós do dispositivo, soquetes, pipes nomeados etc. A linha de comando acima também considera ACLs e atributos estendidos. Você pode ajustar o que está visualizando alterando as opções rsync, limitando-o a um dispositivo -x, alterando o comportamento do link físico e físico, etc.

abligh
fonte
2

janos já disse o que fazer:

find /a -exec stat -c '%A %C %F %g %u %s %Y %n' {} \; >a
find /b -exec stat -c '%A %C %F %g %u %s %Y %n' {} \; >b

diff -u a b

E man 1 statdiz:

%A     access rights in human readable form
%C     SELinux security context string
%F     file type
%g     group ID of owner
%u     user ID of owner
%s     total size, in bytes
%Y     time of last modification, seconds since Epoch
%n     file name

Para comparar o conteúdo do arquivo, você pode usar:

find -type f -exec md5sum '{}' ';' | sort | uniq --all-repeated=separate -w 33 | cut -c 35-

as described here: http://www.commandlinefu.com/commands/view/3555/find-duplicate-files-based-on-size-first-then-md5-hash

fonte
Esta solução não fornece uma solução viável. O diff exibido é livre de contexto e muito difícil de ler. Estou procurando algo que possa me mostrar um nome de arquivo e o que há de diferente nele. Não é uma diferença em dois achados, que é um animal completamente diferente.
Michael Gantz
1
O GNU findpossui os recursos do GNU statintegrados (e antecede as estatísticas do GNU por décadas). Você também deseja classificar a saída antes de diferir. E você precisa, (cd /a && find . ...)caso contrário, todas as linhas serão diferentes por causa de /avs /bno caminho do arquivo.
Stéphane Chazelas
0

Aqui está um script bash rápido que escrevi para comparar atributos estendidos. Ele imprime todos os nomes de arquivos e, em seguida, quaisquer diferenças nos atributos:

cd a
export relpath=[path/to/b/from/a]

for filename in $(find .);
do
    echo $filename;
    diff <(xattr -l $filename) <(xattr -l $relpath/$filename);
done

Tomando emprestado de outra resposta, podemos modificá-lo para usar em statvez dexattr :

for filename in $(find .);
do
    echo $filename;
    diff <(stat -c '%A %C %F %g %u %s %Y' $filename) <(stat -c '%A %C %F %g %u %s %Y' $relpath/$filename);
done
Aaron Campbell
fonte