Як знайти файли, які не належать жодному пакету?


12

У моїй системі у мене є файли, які не належать до жодного пакету, вони є моїми або з компільованих програм, встановлених на make install. Як я можу знайти всі файли, які не належать до жодного пакету?

Відповіді:


10

У /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) тощо.

помилкаfind: argument list too long
naught101

@ naught101 Це означає, що збігаються файли в gazillion файлів /var/lib/dpkg/info/*.list- вище запит потрібно буде переписати за іншим принципом.
Патріс Левеск

6

Більш ефективна версія рішення @ Patrice з використанням оболонки з підтримкою заміни процесу ( bash, AT&T ksh, zsh):

(
  export LC_ALL=C
  comm -23 <(find / -xdev -type f | sort) \
           <(sort -u /var/lib/dpkg/info/*.list)
)

Як і рішення Патріса, воно передбачає, що жоден шлях файлу не містить символів нового рядка.


1
Чи було б використання locateбази даних швидше, ніж запуск find? locate \* | grep -v "^/home/"- також має перевагу заглянути в /boot/інші системні розділи.
naught101

3

Оскільки ви позначені вами питання з debianочевидним вибором, про який ще не було сказано, це використовувати, cruft-ngякщо вам не потрібна гнучкість або cruftякщо ви не хочете шукати всю систему / розміщенуb.


0

Ви також можете використовувати заміну процесу & 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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.