Bagaimana menemukan file yang tidak dimiliki oleh paket apa pun?

12

Dalam sistem saya, saya memiliki file yang bukan milik paket apa pun, itu milik saya atau dari program yang dikompilasi yang diinstal make install. Bagaimana saya bisa menemukan semua file yang bukan milik paket apa pun?

geaplanet
sumber

Jawaban:

10

In /var/lib/dpkg/infoadalah .listfile teks yang mencantumkan semua file yang terkandung dalam setiap paket¹ yang diinstal melalui manajer paket Debian.

Menemukan semua file di sistem file yang tidak cocok dengan entri apa pun di sana dapat dicapai dengan sesuatu yang naif seperti ini:

find / -xdev -type f \( -exec grep -xq "{}" /var/lib/dpkg/info/*.list \; -or -print \)

Ini jelas akan memakan waktu yang sangat lama karena seluruh sistem file akan dipindai. Jika Anda menggunakan partisi yang berbeda untuk direktori sistem (seperti /usratau /var), tentukan setelah partisi awal /.

Peringatan: Itu tidak termasuk file yang dibuat oleh skrip paket. Misalnya:

  • /etc/hosts.allowtidak terdaftar di mana pun tetapi mungkin berasal dari libwrap0yang mungkin membuatnya, jika file itu tidak ada pada saat instalasi paket.
  • Banyak file dikompilasi selama instalasi, misalnya .pycfile (dikompilasi perpustakaan Python), .elcfile (dikompilasi pustakawan Emacs Lisp), dll.
  • ...
Patrice Levesque
sumber
kesalahanfind: argument list too long
naught101
@ naught101 Itu menunjukkan ada trilyun file yang cocok /var/lib/dpkg/info/*.list- kueri di atas perlu ditulis ulang di bawah beberapa prinsip lain.
Patrice Levesque
6

Versi yang lebih efisien solusi @ Patrice , menggunakan shell dengan dukungan untuk substitusi proses ( bash, AT&T ksh, zsh):

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

Seperti solusi Patrice, ini mengasumsikan tidak ada jalur file yang berisi karakter baris baru.

Stéphane Chazelas
sumber
1
Apakah menggunakan locatebasis data lebih cepat daripada menjalankan find? locate \* | grep -v "^/home/"- Juga memiliki manfaat melihat ke dalam /boot/dan partisi sistem lainnya.
naught101
2

Karena Anda menandai Anda, pertanyaan dengan debianpilihan yang jelas belum disebutkan adalah untuk digunakan cruft-ngjika Anda tidak memerlukan fleksibilitas atau cruftjika Anda tidak ingin mencari melalui seluruh sistem / terletakb.

stefanct
sumber
0

Anda juga dapat menggunakan subtitusi proses & grep& find. Perhatikan bahwa grepdigunakan dua kali untuk memfilter hanya jalur yang relevan dari /var/lib/dpkg/infountuk menghemat beberapa detik jika Anda mencari file di direktori tertentu.

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)
Josef Kufner
sumber