У моїй системі у мене є файли, які не належать до жодного пакету, вони є моїми або з компільованих програм, встановлених на make install
. Як я можу знайти всі файли, які не належать до жодного пакету?
У моїй системі у мене є файли, які не належать до жодного пакету, вони є моїми або з компільованих програм, встановлених на make install
. Як я можу знайти всі файли, які не належать до жодного пакету?
Відповіді:
У /var/lib/dpkg/info
це .list
текстові файли, список всі файли , що містяться в кожному package¹ встановлений через менеджер пакунків Debian.
Пошук усіх файлів у файловій системі, що не відповідають жодному запису, може бути досягнутий чимось наївним, як це:
find / -xdev -type f \( -exec grep -xq "{}" /var/lib/dpkg/info/*.list \; -or -print \)
Це, очевидно, займе дуже багато часу, оскільки вся файлова система буде відсканована. Якщо ви використовуєте різні розділи для системних каталогів (наприклад, /usr
або /var
), вкажіть їх після початкових /
.
Попередження. Це не включає файли, створені скриптами пакетів. Наприклад:
/etc/hosts.allow
не вказаний ніде, але він може походити від того, libwrap0
що можливо створив його, якщо цей файл не існував під час встановлення пакета..pyc
файли (зібрані бібліотеки Python), .elc
файли (зібрані бібліотеки Emacs Lisp) тощо./var/lib/dpkg/info/*.list
- вище запит потрібно буде переписати за іншим принципом.
Більш ефективна версія рішення @ Patrice з використанням оболонки з підтримкою заміни процесу ( bash
, AT&T ksh
, zsh
):
(
export LC_ALL=C
comm -23 <(find / -xdev -type f | sort) \
<(sort -u /var/lib/dpkg/info/*.list)
)
Як і рішення Патріса, воно передбачає, що жоден шлях файлу не містить символів нового рядка.
locate
бази даних швидше, ніж запуск find
? locate \* | grep -v "^/home/"
- також має перевагу заглянути в /boot/
інші системні розділи.
Ви також можете використовувати заміну процесу & grep
& find
. Зауважте, що grep
використовується два рази для фільтрації лише відповідних шляхів, /var/lib/dpkg/info
щоб заощадити кілька секунд, якщо ви шукаєте файли в певному каталозі.
dir="/lib/x86_64-linux-gnu"
find "$dir" -type f \
| grep -v -x -F -f \
<(find '/var/lib/dpkg/info' -name '*.list' -print0 \
| xargs -0 grep -h -F "^$dir" \
| sort -u)
find: argument list too long