zacapaca
(usa Outra)
Enviado em 22/10/2021 - 08:56h
Olá,
Eu utilizo um sistema parecido com o que vc está tentando desenvolver, então vou da rumas dicas.
Supondo que você queira tirar a soma de checagem para toda árvore de diretório, vai ficar mais fácil. Acho que é este o seu caso, no post inicial você postou um exemplo com "/Volume/WD/A", então estou imaginando que seja o diretório mais alto e que você queira checar *todos* os arquivos que ele contém. Basta rodar o comando no diretório mais alto e gerar um único arquivo com todas as somas e nomes dos arquivos!
Então, como você já sabe usar o find, e entende a opção do uso do nulo como delimitador, então não vou me estender nisso.. Mas vou propor uma sintaxe um pouco diferente, pois não é necessário usar algumas outras opções do xargs para melhorarmos a velocidade..
Você está usando o sha256sum. Há alguma razão específica para isso ou você precisa de uma shasum de 256 bits? No git, o Linus uso sha1sum para checar os arquivos. Sha1sum já seria o suficiente, é bem mais rápido. Mas eu vou propor o uso o pacote "cksum" ou "sum", que são mais antigos e muito mais rápidos.
Compare as saídas:
# cksum
1990027854 1870 listaMa.txt
282246572 116302 log.txt
3535307299 4066 ls++.conf
2417648107 242 todo.txt
2288352402 215 XTerm2021-10-21.02:20:03
2276778746 640 Xterm.log.archhost.2021.10.21.01.59.09.12278
3862682794 402 Xterm.log.archhost.2021.10.21.03.02.58.14198
3836534940 644 Xterm.log.archhost.2021.10.21.03.08.17.14481
# sah1sum
6a13f0edc6b8229d0142e6fddb647012c34a8a27 listaMa.txt
d4049597c61f3621b35dd647f82756318e59c792 log.txt
c4a26b2fcac059073641bf52306e57521f66fcb7 ls++.conf
49e97bcaa9014c5d4020b95ebdc9599930ff279e todo.txt
4204dceb9c62031eba0822d1081970c7f3bfc205 XTerm2021-10-21.02:20:03
ade735bea75059c980af22a521128c9e481ff0e9 Xterm.log.archhost.2021.10.21.01.59.09.12278
541f040a549aa04243d81bb5926fc806bd4071b5 Xterm.log.archhost.2021.10.21.03.02.58.14198
d36ece9c3d970553df3580fa5981f40087cedc49 Xterm.log.archhost.2021.10.21.03.08.17.14481
A saída do "cksum" é muito boa por que além de um número fácil de ler (a soma de checagem, primeiro campo), o segundo campo tem a informação de quantos cilindros o arquivo tem, ou seja, o tamanho em bytes... E no terceiro campo, o nome do arquivo.
Proporia algo assim:
$ cd "/Volume/WD/A"
$ find . -type f -print0 | xargs -0 cksum > cksum.txt
Depois que tiver vários arquivos com as somas de checagem da árvore de diretório, basta compará-los com "diff", "vimdiff", ou o "meld" (GUI)..
Ou até o grep, para pegar os arquivos que diferem entre um arquivo de checagem e o outro (por exemplo, "cksum1.txt" e "cksum2.txt"):
$ grep -v -f cksum1.txt cksum2.txt | awk '{print $3}'
A opção -v do grep só imprime as linhas de "cksum2.txt" que são diferentes do arquivo "cksum1.txt". A opção "-f [ARQUIVO]" serve para o grep usar cada linha do arquivo "cksum1.txt" como um padrão de busca em "cksum2.txt"...
O awk vai imprimir somente o terceiro campo, que é o nome dos arquivos que diferem.. Se houver espaços em branco nos nomes dos arquivos, pode tentar algo como: awk '{for(i=3;i<=NF;++i)print $i}'