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.
linux
command-line
bash
lukemk1
fonte
fonte
Respostas:
Em câmera lenta:
egrep
significa que estamos usando EREs (Regexps estendidos)|
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-seed
etc ..., que excluem os arquivos desses diretórios.Tão globalmente:
/
sistema de arquivos (devido a-xdev
), então isso exclui,/proc
por exemplo, e possivelmente outros sistemas de arquivos (dado o resto, não ficaria surpreso em/var
ser um FS separado) e filtre diretórios específicos, como mostrado acima.xargs md5sum
)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
...)fonte
| xargs md5sum 2> /dev/null | tr -s "[:space:]" | md5sum | cut -d\ -f1
Entendo algumas partes, mas não como tudo flui junto.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 ....
fonte