Temukan file yang tidak diinstal oleh manajer paket


8

Saya ingin mendapatkan daftar semua file di sistem Linux Gentoo saya yang tidak diinstal oleh manajer paket (Portage). Ini karena saya ingin menjaga sistem saya sebersih mungkin, menghapus semua file yang tidak berguna.

Biarkan saya memberi tahu Anda apa yang telah saya coba sampai sekarang. Pertama-tama, saya membuat daftar semua file milik beberapa paket yang dilacak oleh Portage:

equery files "*" | sort | uniq > portage.txt

Lalu saya membuat daftar semua file di sistem saya, kecuali yang tidak saya pedulikan:

find / \( -path /dev -o -path /proc -o -path /sys -o -path /media \
          -o -path /mnt -o -path /usr/portage -o -path /var/db/pkg \
          -o -path /var/www/localhost/htdocs -o -path /lib64/modules \
          -o -path /usr/src -o -path /var/cache -o -path /home \
          -o -path /root -o -path /run -o -path /var/run -o -path /var/tmp \
          -o -path /var/log -o -path /tmp -o -path /etc/config-archive \
          -o -path /usr/local/portage -o -path /boot \) -prune \
          -o -type f | sort | uniq > all.txt

Akhirnya, saya mendapatkan daftar semua file yang tidak dilacak oleh Portage:

comm -13 portage.txt all.txt > extra.txt

Beberapa statistik:

wc -l portage.txt all.txt extra.txt
  127724 portage.txt
   78371 all.txt
    8438 extra.txt

Seperti yang Anda lihat, saya masih mendapatkan lebih dari delapan ribu file tambahan. Saya ingin mengurangi angka itu, agar lebih fokus pada file yang benar-benar perlu dihapus.

Saya perhatikan bahwa extra.txtada ribuan file di sejumlah kecil direktori, seperti /usr/lib64/gcc, /usr/lib64/python2.7dan /usr/lib64/python3.2. The /usr/lib64/gcc/x86_64-pc-linux-gnu/4.6.3/crtbegin.ofile, misalnya, tidak dalam portage.txtkarena, di tempatnya, ada /usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/crtbegin.o. Di sistem saya /usr/libadalah symlink ke /usr/lib64. Jadi sepertinya saya perlu menangani symlink dengan benar untuk mendapatkan hasil yang lebih baik. Mungkin dengan menambahkan portage.txtsemua file yang mereka tuju. Saya tidak benar-benar tahu bagaimana melakukan itu.

Juga, mengapa portage.txtlebih besar dari itu all.txt? Bukankah seharusnya sebaliknya karena file yang dilacak oleh Portage adalah bagian dari semua file di sistem saya?

Akhirnya, apakah saya lupa lokasi lain dalam findperintah yang juga harus dikecualikan?


1
"Ini karena saya ingin menjaga sistem saya sebersih mungkin, menghapus semua file yang tidak berguna yang ada di sekitar." - Apakah waktu Anda sendiri yang telah Anda habiskan untuk yang lebih murah daripada megabyte ruang disk yang terbuang? :)
poige

Yah, saya seharusnya mengatakan bahwa itu juga untuk mencari file milik paket yang belum diinstal melalui manajer paket. Saya membutuhkan sebuah program tetapi tidak ada ebuild terbaru yang tersedia, dan saya belum belajar bagaimana menulis ebuild dengan benar.
Francesco Turco

Ini mungkin bermanfaat: us.generation-nt.com/answer/…
red.

Jawaban:


2

Apa yang Anda cari mungkin qfile. Ini adalah bagian dari app-portage/portage-utilspaket dan menyediakan opsi -oatau --orphans. Anda dapat menggunakan sesuatu seperti

find /usr/bin | xargs -I{} qfile -o {}

untuk mendapatkan daftar file yatim di /usr/bin.

Catatan: Sayangnya, qfiledalam versi portage-utils yang stabil saat ini, tidak mendukung readin dari stdin, dan solusi yang disebutkan di halaman manual qfile qfile -o $(find /usr/bin)tidak berfungsi jika set hasil pencarian besar, oleh karena itu kita harus mengatasinya sedikit, menggunakan xargs.

BTW, ini bukan sesuatu yang saya sendiri buat, tapi saya menemukannya di gossamer-threads, sebuah komentar oleh yvasilev .


Gentoo tidak menggunakan manajer paket Debian.
vonbrand

1
Benar. Gentoo menggunakan portage. Seperti pertanyaan aslinya dinyatakan dengan jelas. Siapa yang ingin tahu cara menemukan file yatim di sistem Debian?
luttztfz

0

IIRC, gentoo menyimpan info paket dalam teks biasa (/ var / db / mungkin), pencarian langsung bisa lambat.

Cara terbaik untuk melakukannya, adalah membuat database sqlited (atau apa pun db) untuk semua file paket, lalu daftarkan semua file di sistem Anda, cari di db satu per satu, jika tidak ditemukan, itu bukan milik portage .


0

Saya berhasil memperbaiki masalah terkait symlinks portage.txtdengan menjalankan perintah berikut:

equery files '*' | while read i; do readlink -e "${i}"; done | sort | uniq \
       > portage.txt

Ini berfungsi untuk menempatkan portage.txtfile symlink menunjuk ke, dan bukan symlink sendiri. Ini diperlukan karena findperintah yang dibuat all.txttidak mencantumkan symlink, tetapi hanya file yang mereka tuju, sehingga akan ada banyak false positive. Ini perintah yang lambat, karena dijalankan readlinkpada ribuan file, tetapi saya tidak dapat menemukan solusi yang lebih baik. Setiap saran diterima.

Hal lain yang saya mengerti (ini lebih mudah) adalah mengapa portage.txtlebih besar dari all.txt. Ini terutama disebabkan oleh fakta bahwa saya secara eksplisit memangkas /usr/srcdirektori dan semua file di bawah dari hasil findperintah, tetapi equerymencantumkannya terlepas.

Hal terakhir yang saya lakukan, bahkan jika ini tidak dalam pertanyaan, adalah untuk mengabaikan hal-hal Python (sebagian besar __pycache__file dan file dengan .pycatau .pyoakhiran):

grep '\(\.cpython-32\)\?\.py[co]$\|/__pycache__' candidates.txt \
     > candidates-bytecode.txt
sed -e 's/\(\.cpython-32\)\?\.py[co]$/.py/' \
    -e 's/\/__pycache__//' \
    candidates-bytecode.txt | sort | uniq \
    > candidates-bytecode-source.txt
comm -23 candidates-bytecode-source.txt portage.txt \
     > orphaned-bytecode.txt

Dengan cara ini saya melacak asal semua barang Python dan memeriksa apakah ada di portage.txt. Seperti yang Anda lihat, saya menulis ekspresi reguler yang sama dua kali, satu untuk grepperintah dan yang lainnya untuk sedperintah, tetapi mungkin bisa dilakukan hanya dalam satu langkah.


Mungkin akan jauh lebih cepat, hanya dengan menggunakan cat /var/db/pkg/*/*/CONTENTS | sed -r 's/^... //; s/ ([0-9a-f]+ )[0-9]+$//; s/ -> .*$//'secara langsung, bukan dengan Python yang sangat lambatequery files '*'
Evi1M4chine
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.