Encontrando mudança no objeto compartilhado através do bash

2

Aqui está o meu caso - eu tenho um pacote chamado say foo-1.2.3 . Eu quero saber qual pacote ele instala. Então, eu o instalo em uma abordagem fakeroot e faço uma lista de todos os arquivos que ele instala em um arquivo chamado FILES

Suponha que eu queira atualizá-lo para foo-1.2.4 . Da mesma forma, criei o arquivo FILES para ele. Eu sei que se o nome da biblioteca compartilhada for alterado, todos os pacotes vinculados dinamicamente a ele precisam ser re-compilados. Então eu quero escrever um script bash que me avise.

Por exemplo, diga que o antigo FILES contém -

/usr/lib/libfoo.so.1
/usr/lib/libfooabc.so.1
/usr/lib/something.so.1
/usr/share/doc/foo-1.2.3/whatever

E digamos que o novo FILES contenha -

/usr/lib/libfoo.so.2
/usr/lib/libfooabc.so.2
/usr/lib/something.so.1
/usr/share/doc/foo-1.2.4/whatever

Eu quero que o script me avise que /usr/lib/libfoo.so.1 e /usr/lib/libfooabc.so.1 foram alterados.

Eu tentei isso

grep -F -x -f old new|grep -E *\.so\.*

Mas não funciona como esperado quando o arquivo old é -

/usr/lib/libfooabc.so.1
/usr/lib/libfoo.so.1
/usr/lib/libfoo.so.2
/usr/lib/something.so.1
/usr/share/doc/foo-1.2.3/whatever

E new é -

/usr/lib/libfoo.so.2
/usr/lib/libfoo.so.3
/usr/lib/libfooabc.so.2
/usr/lib/something.so.1
/usr/share/doc/foo-1.2.4/whatever

A saída é -

/usr/lib/libfoo.so.2
/usr/lib/something.so.1

A saída desejada é -

/usr/lib/libfooabc.so.1
/usr/lib/libfoo.so.1
    
por Aniket Bhattacharyea 28.05.2016 / 17:52

1 resposta

2

Eu criei duas opções usando o diff que deve funcionar para você.

Usando diff -u e sed:

diff -u old new | sed  -n 's/^-\(.*\.so\..*\)//p'
/usr/lib/libfoo.so.1
/usr/lib/libfooabc.so.1
  • Esse comando gera a diferença completa entre os dois arquivos e usamos sed para filtrar apenas as alterações do arquivo 'antigo' (indicado por um líder -) e outro filtro no diff contendo .so. . Para tira o - da saída do diff usamos uma referência anterior para imprimir tudo menos isso.

Usando formatação de saída do diff e grep

Duas variantes na mesma coisa; o segundo é mais curto, ambos se comportam de forma idêntica um ao outro e ao exemplo anterior.

diff --old-line-format='%L' --unchanged-line-format= --new-line-format= old new | grep '\.so\.'

ou um pouco melhor:

diff --changed-group-format='%<' --unchanged-line-format=  old new | grep '\.so\.'

Você pode conseguir que o diff faça o trabalho sozinho - ele tem filtragem de regex (-I ignore flag), mas ele se comporta de maneira estranha quando você precisa inverter o regex. Eu nunca tive muita sorte com isso.

    
por 28.05.2016 / 22:47