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.


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...)


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 ....

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.