Compreendendo um comando Find complexo

0

Estou trabalhando na limpeza do código de script em uma máquina Linux que um desenvolvedor anterior havia criado quando me deparei com este comando:

find / -xdev -type f | egrep -v "^/etc/shadow|^/etc/random-seed|^/root/logs/|^/root/.ash|^/root/configs" | xargs md5sum 2> /dev/null | tr -s "[:space:]" | md5sum | cut -d\  -f1

Estou tentando entender completamente o que exatamente cada parte do comando faz, mas a parte grep está me excitando.

Eu sei que a saída é essencialmente um valor de soma de verificação do sistema de arquivos, mas eu preciso saber exatamente como isso acontece.

Obrigado.

lukemk1
fonte
Por que podar quando você pode grep? Ign
Ignacio Vazquez-Abrams

Respostas:

1

Em câmera lenta:

egrep -v "^/etc/shadow|^/etc/random-seed|^/root/logs/|^/root/.ash|^/root/configs"
  • egrep significa que estamos usando EREs (Regexps estendidos)
  • -v inverte a seleção (mantenha o que não corresponde)
  • O |estão ORing as várias expressões
  • ^ é a correspondência "início da linha"

Portanto, remove as linhas que começam com /etc/shadow, /etc/random-seedetc ..., que excluem os arquivos desses diretórios.

Tão globalmente:

  • encontre todos os arquivos apenas no /sistema de arquivos (devido a -xdev), então isso exclui, /procpor exemplo, e possivelmente outros sistemas de arquivos (dado o resto, não ficaria surpreso em /varser um FS separado) e filtre diretórios específicos, como mostrado acima.
  • calcular um hash MD5 de todos esses arquivos ( xargs md5sum)
  • massagear essa lista de hashes um pouco
  • calcular um hash MD5 da lista de hashes MD5 md5sum | cut -d\ -f1

Em outras palavras, ele calcula um hash combinado de todos os arquivos no disco, provavelmente para verificar se nada mudou desde a última vez em que foi computado (e é por isso que eu ficaria surpreso ao saber que / varé levado em consideração, uma vez que seu conteúdo muda ao longo do tempo: /var/log, /var/mail, /var/lib...)

xenoid
fonte
Muito obrigado. Isso explicava claramente. Você também pode explicar o restante do comando? | xargs md5sum 2> /dev/null | tr -s "[:space:]" | md5sum | cut -d\ -f1 Entendo algumas partes, mas não como tudo flui junto.
precisa saber é o seguinte
Eu verifiquei os sistemas de arquivos neste sistema e descobri que "/", "/ dev", "/ dev / shm" e "/ tmp" são sistemas de arquivos separados, mas que / var não é. Vou precisar modificar esse código para incluir alguns dos diretórios ausentes. Isso explicaria por que as somas de verificação sempre parecem relatar diferenças.
lukemk1
0

A resposta da xenoid é válida, portanto não a repetirei. Mais alguns esclarecimentos desde que o lukemk1 os pediu em seu comentário acima sobre esta parte: | xargs md5sum 2> / dev / null | tr -s "[: espaço:]" | md5sum | cut -d \ -f1

"| xargs md5sum": permite aplicar o comando md5sum com o argumento sendo todos os nomes de arquivos canalizados (pode ser um pouco mais complexo aqui).

"2> / dev / null": significa jogar fora o fluxo stderr

"| tr -s" [: space:] "": (por "man tr" [: space:] são todos os espaços em branco horizontais ou verticais e o sinalizador -s (- squeeze-repeats) aperta repetições consecutivas desse tipo de espaço .

"| md5sum": pega o md5sum do fluxo de md5sums

"| cut -d \ -f1": Usando espaço ("\") como os campos delimitadores, imprima apenas o primeiro campo (na verdade, apenas o número md5sum)

Isso não fazia parte da pergunta, mas um problema que vejo com o comando geral é que, se houver espaço nos nomes dos arquivos, ele não funcionará conforme o esperado; para corrigir, você precisa usar find ... -print0 | .... xargs -0 ....

ssskkk
fonte