Последовательность шагов для поиска пакетов, которые давно не переустанавливались.

Захотелось обновить или переустановить пакеты, которые давно не обновлялись и не переустанавливались.

Для этого сделал следующие шаги:

1. Нашёл пакеты, которые устанавливались недавно в 2019 или в 2020 году


$ qlop -m | grep -E '^(2019|2020)' >> packages_after2019

2. Создал список с пакетами, которые установлены в системе


$ qlist -IC >> installed_packages

3. Из файла packages_after2019 убрал лишнее в текстовом редакторе, с помощью регулярных выражений:
\n[\d-T: >]+

4. Далее с помощью доп. функций текстового редактора отсортировал список в packages_after2019, чтобы удалить строки с одинаковыми названиями пакетов.

5. Чтобы удалить одинаковые строки использовал интерпретатор Haskell ghci. Для этого преобразовал содержимое packages_after2019 в Haskell-ный список, с помощью замены '\n' на '", "'.

6. Далее применил к списку Haskell-ное решение:
tail $ foldl (\acc x -> if last acc /= x then (acc ++ [x]) else acc) [""]

7. Преобразовал Haskell-ный список в прежний формат файла packages_after2019 - на каждой строке остаётся только категория и название пакета.

8. В конце концов, чтобы получить желаемый список пакетов, которые не обновлялись и не переустанавливались, нужно исключить из файла installed_packages название пакетов, которые есть в packages_after2019.
На просторах интернета, есть много решений, для последнего пункта, например:
comm -13 <(sort -u packages_after2019) <(sort -u installed_packages)

Просто не хочется думать. XD
Просто не хочется думать в одиночестве над оптимизацией этой последовательности шагов.

Новое решение(добавлено 22.12.2020):

Выводит пакеты, которые в последний раз переустанавливались в 201? году:

qlist -ICv | while read name; do qlop -mtv $name | tail -n1; done | grep -E '^201.' | sort

А точно с этой стороны держать паяльник удобнее ;)

qlist -ICv | while read name; do grep $name /var/log/emerge.log | grep completed |tail -n1; done | sort

Чем конечный список полезнее

Чем конечный список полезнее чем qlist -IC?
У меня во конечном списке, только opencl добавился - не знаю почему.

Но принцип понятен...

.

что есть конечный список?

Если про -v, то имя без номера приводило к захвату другого пакета. Жадный-нежадный поиск... не мой конек.
Ищем aaa/bcd, а захватываем aaa/bcdefg.
Ищем aaa/bcd-1.2.3 и не захватим aaa/bcdefg-1.2.3

А коммент был, что в обратную сторону решать проще.

Только всё это баловство. Просто старая добрая пересборка мира более осмысленная, чем вторая волна, недошедшая до конца. А если дойдет, то это и есть пересборка мира.

.

Kevol написал(а):
старая добрая пересборка мира

Старая? Ну, да. Добрая? Вот уж вряд ли... Если это не первая сборка, на порядки эффективнее qcheck -uv

Мы тоже не всего читали Шнитке!.. © В. Вишневский

.

Вопрос стоял пересобрать старые. Смысл пересобирать старые и не собирать по ним новые?

Не понял причем здесь лучше проверка целостности? Если пакет не цел, то это уже беда-беда. Вроде бы вопросы ортогональные.
Может у автора есть желание пересобрать старые пакеты с новыми флагами оптимизации и т.п. ?

.

Kevol написал(а):
лучше проверка целостности?

Это не просто проверка, курите маны

Цитата:
Если пакет не цел, то это уже беда-беда

приведённая команда как раз на такой случай, т.к. автоматически восстановит все повреждённые пакеты (а не это ли и есть цель пересборки старых?). Единственный оправданный случай пересборки мира - начальная сборка, остальное - от лукавого

Мы тоже не всего читали Шнитке!.. © В. Вишневский

.

Spoiler написал(а):
Kevol написал(а):
лучше проверка целостности?

Это не просто проверка, курите маны

qcheck - verify integrity of installed packages
-u, --update - Update missing files, chksum and mtimes for packages.
-v "Ну это знаю" (C)

Где здесь кроме проверки целостности? Может что-то не то покурил, кроме man qcheck?

Побил бы меня слепнога за зачитывание манов вслух.

Spoiler написал(а):
Kevol написал(а):
Если пакет не цел, то это уже беда-беда

приведённая команда как раз на такой случай, т.к. автоматически восстановит все повреждённые пакеты (а не это ли и есть цель пересборки старых?). Единственный оправданный случай пересборки мира - начальная сборка, остальное - от лукавого

Если пакет не цел, то беда в причине ее повредившей. А это вряд ли исправится пересборкой. (Именно этой мысли соответствовало "беда-беда")

Начальная сборка может происходить с очень длительной отсрочкой. Были прецеденты. Когда CFLAGS поменял, а мир собирать отложил.

Только я не экономил как автор топика на спичках, а пересобрал мир (когда время для меня было более подходящим).

.

Kevol написал(а):
Где здесь кроме проверки целостности?

...Update...

Kevol написал(а):
Если пакет не цел, то беда в причине ее повредившей. А это вряд ли исправится пересборкой

В Gentoo наиболее вероятной причиной является внешнее воздействие (в частности руки-крюки), и пересборка пакета с несовпавшим хэшем (тот самый апдейт по признакам missing files, chksum and mtimes) здесь в самый раз

Мы тоже не всего читали Шнитке!.. © В. Вишневский

Spoiler

Spoiler написал(а):
Update...

vs восстановление с бэкапа. И то первой мыслью у меня было бы проверять память, а не восстанавливать. Система ничто - данные всё!

Про руки согласен.

Я вообще не понимаю смысла хотелки

Для пересборки с новыми флагами есть специальная опция и незачем огород городить!..
Я вообще не понимаю смысла хотелки по этому топику.

.

Я тоже не понимаю причин автора.

Повторяю, я просто исправил путь рассуждений.

И под флагами я имел ввиду не USE, а CFLAGS.

Хотя, может что-то пропустил ... может теперь можно emerge указать, когда рваться в бой после изменений, а когда не обращать внимания, что остальные пакеты собрались бы по другому.

Как минимум, нашёл таким

Как минимум, нашёл таким образом пакеты, которые в системе были не нужны. Обычным способом их было не видно, потому что от них зависели другие пакеты.
Например, был такой:

2017-09-18T00:55:00 >>> virtual/pam-0-r1: 8s
# equery d virtual/pam
 * These packages depend on virtual/pam:
sys-apps/shadow-4.7 (virtual/pam:0/0)
# equery d sys-apps/shadow
 * These packages depend on sys-apps/shadow:
mail-mta/nullmailer-2.2-r1 (sys-apps/shadow)
net-misc/openssh-8.2_p1-r5 (sys-apps/shadow)

portage писал:

emerge: there are no ebuilds to satisfy "virtual/pam".

Я правильно понимаю - если нет ebuild-a - значит нужно обновлять пакеты, которые от него зависят и удалять сам пакет?

Не совсем... надо держать

В принципе почти так, но не совсем... лучше держать систему в синхронизации с главным репозиторием и вовремя удалять устаревшие пакеты:

eix-sync
emerge -uDNU --changed-deps=y --with-bdeps=y --backtrack=30 --verbose-conflicts @world -q
emerge --depclean -a

Ну и всегда читать новости:

eselect news list

там есть много полезного и интересного!

Это не работает, потому

Это не работает, потому как:

1. В приличной системе отсутствие ротации /var/log/emerge.log в течение нескольких лет - признак плохого администрирования.

2. Пакет прог-123 мог обновиться и скомпилироваться как прог-124.

.

1. Ну, присутствие ротации это особенность частной системы, которую можно учесть хозяину.
Я потратил 1.5 минуты на написание. Проверил. Поправил. Автор тоже может повторить проверку.

Автор топика шел в обратном направлении. Я просто показал путь другом направлении.

2. Можно пример? когда пакет установился под одним номером, а в логе числится под другим.
Если пакет обновился, то есть две ситуации. Обе версии присутствуют в системе, или старая удалена. В первом случае в перечне пакетов будут присутствовать обе, во втором последняя версия и запись для старой версии в логе уже не имеет смысла.
(тавтология какая-то)
Короче, с этим пунктом не согласен.

А не проще

А не проще emerge -e @world -q?! :) Или

emerge -uDNU --with-bdeps=y --changed-deps=y --verbose-conflicts @world -q

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

Если тебе уж очень хочется

Если тебе уж очень хочется принудительно пересобирать старые пакеты, то флаг тебе в руки:

emerge -1 $(qlist -ICv|xargs -I '{}' qlop -mv '{}'|sort -r|sort -k3 -u|sort|while read t s p;do if [[ `date -d $t +%s` -gt `date -d "666 days ago" +%s` ]] ;then break;fi;echo $p|sed 's/-[[:digit:]].*$//';done) -q

здесь 666 - возраст пакетов (в днях), старше которого пересобирать.
А то накрутили там всякого... :D

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".