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.txt
ada ribuan file di sejumlah kecil direktori, seperti /usr/lib64/gcc
, /usr/lib64/python2.7
dan /usr/lib64/python3.2
. The /usr/lib64/gcc/x86_64-pc-linux-gnu/4.6.3/crtbegin.o
file, misalnya, tidak dalam portage.txt
karena, di tempatnya, ada /usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/crtbegin.o
. Di sistem saya /usr/lib
adalah symlink ke /usr/lib64
. Jadi sepertinya saya perlu menangani symlink dengan benar untuk mendapatkan hasil yang lebih baik. Mungkin dengan menambahkan portage.txt
semua file yang mereka tuju. Saya tidak benar-benar tahu bagaimana melakukan itu.
Juga, mengapa portage.txt
lebih 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 find
perintah yang juga harus dikecualikan?
Jawaban:
Apa yang Anda cari mungkin
qfile
. Ini adalah bagian dariapp-portage/portage-utils
paket dan menyediakan opsi-o
atau--orphans
. Anda dapat menggunakan sesuatu sepertiuntuk mendapatkan daftar file yatim di
/usr/bin
.Catatan: Sayangnya,
qfile
dalam versi portage-utils yang stabil saat ini, tidak mendukung readin dari stdin, dan solusi yang disebutkan di halaman manual qfileqfile -o $(find /usr/bin)
tidak berfungsi jika set hasil pencarian besar, oleh karena itu kita harus mengatasinya sedikit, menggunakanxargs
.BTW, ini bukan sesuatu yang saya sendiri buat, tapi saya menemukannya di gossamer-threads, sebuah komentar oleh yvasilev .
sumber
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 .
sumber
Saya berhasil memperbaiki masalah terkait symlinks
portage.txt
dengan menjalankan perintah berikut:Ini berfungsi untuk menempatkan
portage.txt
file symlink menunjuk ke, dan bukan symlink sendiri. Ini diperlukan karenafind
perintah yang dibuatall.txt
tidak mencantumkan symlink, tetapi hanya file yang mereka tuju, sehingga akan ada banyak false positive. Ini perintah yang lambat, karena dijalankanreadlink
pada 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.txt
lebih besar dariall.txt
. Ini terutama disebabkan oleh fakta bahwa saya secara eksplisit memangkas/usr/src
direktori dan semua file di bawah dari hasilfind
perintah, tetapiequery
mencantumkannya 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.pyc
atau.pyo
akhiran):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 untukgrep
perintah dan yang lainnya untuksed
perintah, tetapi mungkin bisa dilakukan hanya dalam satu langkah.sumber
cat /var/db/pkg/*/*/CONTENTS | sed -r 's/^... //; s/ ([0-9a-f]+ )[0-9]+$//; s/ -> .*$//'
secara langsung, bukan dengan Python yang sangat lambatequery files '*'