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?
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?
Respostas:
Eu fiz isso antes de usar a rsync -aHAX --delete
lembrança para adicionar os sinalizadores -n
e -i
.
Isso é um pouco contra-intuitivo, mas tenha paciência comigo. O rsync
comando principal é o que você precisaria para sincronizar os dois diretórios juntos. Mas -n -i
faz 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 ls
ou 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.
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, 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
find
possui os recursos do GNU stat
integrados (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 /a
vs /b
no caminho do arquivo.
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 stat
vez 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