Найти файлы, не установленные менеджером пакетов RPM

9

Есть ли способ узнать все файлы в данной системе, которые не были установлены через RPM? Я понимаю, что могу сделать это сам, используя что-то вроде rpmquery -fскрипта, который перебирает все файлы в файловой системе, однако мне было интересно, есть ли какой-нибудь стандартный способ сделать это для систем на основе RPM (в частности, Fedora, который я использую в дом). Так как это для Fedora, это хорошо использовать yumили dnfвыяснить это.

Если не существует стандартного способа сделать это, кто-нибудь знает какие-нибудь ранее существующие сценарии для этого? Я не хочу заново изобретать колесо, если мне не нужно.

PS Есть еще один вопрос, похожий на этот , но он касается Gentoo и Portage, поэтому он не совсем актуален.

eestrada
источник
Из любопытства, что будет в действительности?
doktor5000
1
@ doktor5000 У меня есть домашний рабочий стол, к которому за последние пару лет я добавил довольно много стороннего программного обеспечения. Вместо того чтобы пытаться вручную отследить каждый файл, который я установил вне rpm, было бы неплохо получить список этих файлов, чтобы я знал, что копировать вручную, переустанавливать при обновлении системы или просто игнорировать. Мне не повезло, когда я пытаюсь выполнить обновление на месте, если у меня есть Fedora, поэтому я склонен переустанавливать полностью заново.
августа
Ну, может тогда было бы проще сначала ограничиться пакетами rpm, которые не поставляются с базовыми репозиториями. Кроме того, другое программное обеспечение обычно устанавливается в / usr / local по умолчанию или в / opt, что должно быть довольно легко проверить, поскольку оно не используется обычными дистрибутивными пакетами. Для стандартных путей, таких как / usr / bin, / usr / share или / usr / lib и аналогичных, вам, вероятно, придется прибегнуть к одному из методов скриптлета, как указано в моем ответе.
doktor5000

Ответы:

5

немного опоздал на вечеринку, но, надеюсь, кто-то найдет это полезным:

find /usr/ -exec /bin/sh -c "rpm -qf {} &> /dev/null || echo {}" \;

Эта команда сканирует файловую систему и запускается rpm -qfна ней. rpm -qfпечатает соответствующий пакет для файла, и, к счастью, имеет возвращаемое значение 0, если он находит один и 1 в противном случае.

Если вы смелы, вы можете связать вывод | xargs rm -f, но лично я не был бы таким смелым. Оказывается, в / usr есть много вещей, которые на самом деле никому не принадлежат.

akors
источник
3

Насколько я знаю, это невозможно с какой-то отдельной командой, только с помощью небольшого сценария. TL; DR - см. Ссылки внизу. А для систем на основе rpm или других двоичных менеджеров пакетов это не имеет особого смысла. Такие менеджеры пакетов, как правило, представляют собой машины на основе состояния, предназначенные для отслеживания того, что они устанавливают сами, и не для того, чтобы знать все, что пользователи крадут в систему «за спиной» менеджера пакетов.

Где бы вы нарисовали линию для файлов, которые не принадлежат файлам rpm? Как насчет временных файлов (think / tmp и / var / tmp) или кэшей (think / var / cache) или файлов, созданных пользователем (/ home или / srv или других пользовательских точек монтирования).

Для исходных дистрибутивов может иметь смысл предложить эту функциональность, если сценарий использования ограничивает их каталогами FHS, используемыми «системными» пакетами, такими как / usr, / bin, / lib и аналогичными, в отличие, например, от / usr / local или / выбрать стороннее программное обеспечение.


Смотрите следующие похожие вопросы для скриптлетов, чтобы сделать то, что вы просили:

doktor5000
источник
3

В /superuser/555918/how-do-i-list-all-the-files-not-owned-by-any-package-in-a-rpm-based-system следующая команда является твердой основой для того, что вам нужно:

comm -13 <(rpm -qla | sort) <(find / -type f | sort)

Настройка далее путем фильтрации команды поиска в каталогах , представляющих интерес (либо указать список каталогов , вместо того , чтобы /(например /{usr,bin}) или исключая папки , такие как /proc, /dev, /homeи /tmp.

deterb
источник
Более исчерпывающе: comm -13 <(rpm -qla | sort | uniq) <(find / -xdev \( -type f -o -type d -o -type l \) | sort) Это перечисляет ( -l) файлы во всех установленных пакетах ( rpm -qa) и сортирует их, затем удаляет дубликаты (потому что некоторые каталоги поставляются несколькими пакетами). Он также находит все файлы в корневом разделе (не заходя в другие файловые системы - -xdev) и возвращает все файлы, каталоги и символические ссылки ( \( -type f -o -type d -o -type l \)). Затем он использует commдля сравнения, игнорируя записи только в списке rpm ( -1) и записи в обоих ( -3).
IBBoard
Также обратите внимание, что вам может понадобиться использовать sudoв поиске, чтобы вы могли найти файлы (особенно в / etc), к которым имеет доступ только root.
IBBoard