Поиск изменений в общем объекте через bash

Вот мой случай: у меня есть пакет с именем say foo-1.2.3 . Я хочу знать, какой пакет он устанавливает. Таким образом, я устанавливаю его в подходе fakeroot и составляю список всех файлов, которые он устанавливает в файле FILES

Предположим, я хочу обновить его до foo-1.2.4 . Точно так же я создал файл FILES для него. Я знаю, что если имя общей библиотеки изменяется, все пакеты, динамически связанные с ним, должны быть перекомпилированы. Поэтому я хочу написать сценарий bash, который уведомит меня.

Например, скажем, что старые FILES содержат-

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

И, скажем, новые FILES содержат-

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

Я хочу, чтобы сценарий уведомил меня, что /usr/lib/libfoo.so.1 и /usr/lib/libfooabc.so.1 изменились.

Я попробовал это

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

Но это не работает, как ожидалось, когда 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 

И 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 

Выход –

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

Желаемый выход –

 /usr/lib/libfooabc.so.1 /usr/lib/libfoo.so.1 

One Solution collect form web for “Поиск изменений в общем объекте через bash”

Я придумал два варианта использования diff, которые должны работать для вас.

Используя diff -u и sed:

 diff -u old new | sed -n 's/^-\(.*\.so\..*\)/\1/p' /usr/lib/libfoo.so.1 /usr/lib/libfooabc.so.1 
  • Эта команда выводит полный diff между двумя файлами, и мы используем sed, чтобы отфильтровать только изменения из «старого» файла (обозначенные ведущим) и далее фильтровать diff, содержащий .so. , Чтобы вырезать – из выходного сигнала diff, мы используем обратную ссылку для печати всего, кроме этого.

Использование форматирования выходных данных и grep

Два варианта на одном и том же; второй – короче, они оба ведут себя одинаково друг с другом и с предыдущим примером.

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

или немного лучше:

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

Вы можете получить diff для выполнения задания полностью самостоятельно – он имеет фильтрацию регулярных выражений (-I игнорировать флаг), но он ведет себя странно, когда вам нужно инвертировать регулярное выражение. Мне никогда не везло с этим.

  • Запретить обновление «измененного времени» при копировании файлов в установленную папку Samba
  • Перенос исполняемых файлов из Windows в Linux через WinSCP
  • Разница, выполняющая тот же скрипт из Windows, что и Linux
  • Создание списка файлов, удаление «дубликатов» с различным суффиксом
  • Как отсортировать файл на основе раздела поля
  • Как сохранить один файл в каталоге?
  • Псевдо-файлы для временных данных
  • как настроить разрешения «скачать», чтобы предотвратить выполнение эксплойтов
  • Есть ли способ узнать, сколько процессов открывает файл?
  • Как контролировать открытие и закрытие файлов?
  • потерянный в переводе: "изменено на
  • Linux и Unix - лучшая ОС в мире.