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?
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.
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
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
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 parals
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.fonte
janos já disse o que fazer:
E
man 1 stat
diz:Para comparar o conteúdo do arquivo, você pode usar:
fonte
find
possui os recursos do GNUstat
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:
Tomando emprestado de outra resposta, podemos modificá-lo para usar em
stat
vez dexattr
:fonte