Temukan file yang tidak diinstal oleh manajer paket RPM

9

Apakah ada cara untuk mengetahui semua file pada sistem yang diberikan yang tidak diinstal melalui RPM? Saya mengerti bahwa saya dapat memaksa ini sendiri menggunakan sesuatu seperti rpmquery -fdalam skrip yang loop melalui semua file dalam sistem file, namun saya bertanya-tanya apakah ada beberapa cara standar untuk melakukan ini untuk sistem berbasis RPM (khususnya Fedora, yang saya gunakan di rumah). Karena ini untuk Fedora, tidak masalah untuk menggunakan yumatau dnfmencari tahu ini.

Jika tidak ada cara standar untuk melakukannya, apakah ada yang tahu beberapa skrip yang sudah ada untuk melakukan ini? Saya tidak ingin menemukan kembali roda jika saya tidak perlu.

PS Ada pertanyaan lain yang mirip dengan ini , tetapi ini tentang Gentoo dan Portage, jadi tidak sepenuhnya relevan.

eestrada
sumber
Karena penasaran, apa yang akan menjadi kasus penggunaan yang sebenarnya?
doktor5000
1
@ doktor5000 Saya memiliki desktop rumah yang telah saya tambahkan cukup banyak perangkat lunak pihak ke-3 selama beberapa tahun terakhir. Alih-alih mencoba melacak dengan tangan setiap file yang saya instal di luar rpm, akan lebih baik untuk mendapatkan daftar file-file itu sehingga saya akan tahu apa yang akan disalin secara manual, instal ulang ketika saya memperbarui sistem saya, atau abaikan saja. Saya memiliki nasib buruk ketika mencoba upgrade jika Fedora, jadi saya cenderung menginstal ulang benar-benar segar.
eestrada
Kalau begitu mungkin akan lebih mudah untuk membatasi diri Anda untuk paket rpm yang tidak datang dengan repositori dasar. Juga, perangkat lunak lain biasanya diinstal ke / usr / local secara default atau ke / opt yang seharusnya cukup mudah untuk diperiksa karena tidak digunakan oleh paket distro normal. Untuk jalur standar seperti / usr / bin, / usr / share atau / usr / lib dan sejenisnya, Anda mungkin perlu menggunakan salah satu metode scriptlet yang ditautkan dalam jawaban saya.
doktor5000

Jawaban:

5

sedikit terlambat ke pesta, tapi semoga seseorang akan menemukan ini berguna:

find /usr/ -exec /bin/sh -c "rpm -qf {} &> /dev/null || echo {}" \;

Perintah ini merangkak di atas sistem file, dan berjalan rpm -qfdi atasnya. rpm -qfmencetak paket yang sesuai untuk file, dan untungnya memiliki nilai pengembalian 0 jika menemukan satu dan 1 sebaliknya.

Jika Anda berani, Anda bisa mengikat hasilnya | xargs rm -f, tetapi secara pribadi saya tidak akan begitu berani. Ternyata ada banyak barang di / usr yang tidak benar-benar dimiliki oleh apa pun.

akor
sumber
3

Sejauh yang saya ketahui, ini tidak mungkin dilakukan dengan semacam perintah khusus, hanya melalui sedikit skrip. TL; DR - lihat tautan di bagian bawah. Dan untuk sistem berbasis rpm atau manajer paket berbasis biner ini tidak masuk akal. Manajer paket seperti itu biasanya mesin berbasis negara yang dimaksudkan untuk melacak hal-hal yang mereka instal sendiri, dan tidak mengetahui segala sesuatu yang pengguna menyelinap ke sistem "di belakang" manajer paket.

Di mana Anda menggambar garis untuk file yang tidak dimiliki oleh file rpm? Bagaimana dengan file sementara (think / tmp dan / var / tmp) atau cache (think / var / cache) atau file yang dibuat oleh pengguna (/ home atau / srv atau mountpoint yang ditentukan pengguna lain).

Untuk distro berbasis sumber mungkin masuk akal untuk menawarkan fungsionalitas itu jika use case membatasi mereka ke direktori FHS yang digunakan oleh paket "system" seperti / usr, / bin, / lib dan sejenisnya, yang bertentangan dengan eg / usr / local atau / memilih untuk perangkat lunak pihak ke-3.


Lihat pertanyaan serupa berikut untuk skrip untuk melakukan apa yang Anda minta:

doktor5000
sumber
3

Per /superuser/555918/how-do-i-list-all-the-files-not- owned-by-any- any- package-in-a- rpm- based- system , perintah berikut ini adalah dasar yang kuat untuk apa yang Anda butuhkan:

comm -13 <(rpm -qla | sort) <(find / -type f | sort)

Customize lanjut dengan menyaring perintah find ke direktori bunga (baik menetapkan daftar direktori bukan /(misalnya /{usr,bin}) atau tidak termasuk folder seperti /proc, /dev, /home, dan /tmp.

deterb
sumber
Lebih lengkap: comm -13 <(rpm -qla | sort | uniq) <(find / -xdev \( -type f -o -type d -o -type l \) | sort) Daftar ini ( -l) file dalam semua paket yang diinstal ( rpm -qa) dan mengurutkannya kemudian menghapus duplikat (karena beberapa direktori disediakan oleh beberapa paket). Ia juga menemukan semua file di partisi root (tanpa masuk ke sistem file lain - -xdev) dan mengembalikan semua file, direktori dan symlink ( \( -type f -o -type d -o -type l \)). Kemudian digunakan communtuk membandingkan, mengabaikan entri hanya dalam daftar rpm ( -1) dan entri pada keduanya ( -3).
IBBoard
Perhatikan juga bahwa Anda mungkin perlu menggunakan sudopada find sehingga Anda dapat menemukan file (terutama di bawah / etc) yang hanya dapat diakses oleh root.
IBBoard