У моїй системі у мене є файли, які не належать до жодного пакету, вони є моїми або з компільованих програм, встановлених на 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