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

14

Existe uma ferramenta do Linux como o diff que compara recursivamente arquivos e diretórios, mas com a adição de também comparar: atributos estendidos, contextos de ACL e SE?

    
por Michael Gantz 16.01.2014 / 15:34

3 respostas

5

Eu fiz isso antes de usar rsync -aHAX --delete lembrando-se de adicionar as sinalizações -n e -i .

Isso é um pouco contra-intuitivo, mas tenha paciência comigo. O comando principal rsync é o que você precisa para sincronizar os dois diretórios juntos. Mas -n -i faz com que ele NÃO sincronize (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 ls ou similar.

Isto irá olhar para tudo, incluindo mtimes, datas, etc., bem como não seguir em cima de nós de dispositivos, sockets, pipes nomeados, etc. A linha de comando acima também analisa as ACLs e os atributos estendidos. Você pode ajustar o que está procurando alterando as opções para rsync , limitá-lo para um dispositivo com -x , alterar soft & comportamento de link físico etc. etc.

    
por 18.01.2014 / 11:51
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 stat diz:

%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 que 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
    
por 17.01.2014 / 00:55
0

Aqui está um script bash rápido que escrevi para comparar os 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

Utilizando outra resposta, podemos modificar isso para usar stat em vez de xattr :

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
    
por 12.08.2015 / 01:00

Tags