उन फ़ाइलों को कैसे खोजें जो किसी पैकेज के स्वामित्व में नहीं हैं?


12

मेरे सिस्टम में मेरे पास ऐसी फाइलें हैं जो किसी भी पैकेज की नहीं हैं, वे मेरी हैं या संकलित कार्यक्रमों से स्थापित हैं make install। मैं उन सभी फ़ाइलों को कैसे खोज सकता हूं जो किसी भी पैकेज से संबंधित नहीं हैं?

जवाबों:


10

में /var/lib/dpkg/infoहैं .listपाठ फ़ाइलों का सूची सभी फाइलों को प्रत्येक package¹ डेबियन के पैकेज मैनेजर के माध्यम से स्थापित में निहित।

फाइलसिस्टम की सभी फाइलों को किसी भी प्रविष्टि से मेल नहीं खाता, कुछ भोली के साथ इस तरह से प्राप्त किया जा सकता है:

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

यह स्पष्ट रूप से बहुत लंबा समय लगेगा क्योंकि पूरे फाइल सिस्टम को स्कैन किया जाएगा। यदि आप सिस्टम निर्देशिका (जैसे /usrया /var) के लिए अलग-अलग विभाजन का उपयोग करते हैं, तो उन्हें प्रारंभिक के बाद निर्दिष्ट करें /

चेतावनी: इसमें पैकेज स्क्रिप्ट द्वारा बनाई गई फ़ाइलें शामिल नहीं हैं। उदाहरण के लिए:

  • /etc/hosts.allowकहीं भी सूचीबद्ध नहीं है, लेकिन यह libwrap0संभवतः इसे बनाया जा सकता है, अगर यह फ़ाइल पैकेज की स्थापना के समय मौजूद नहीं थी।
  • कई फाइलें संस्थापन के दौरान संकलित की जाती हैं, उदाहरण के लिए .pycफाइलें (संकलित पाइथन लाइब्रेरी), .elcफाइलें (संकलित इमैक लिस्प लाइब्रेरर्स), आदि।
  • ...

त्रुटिfind: argument list too long
n

@ n-0101 से पता चलता है कि मेल करने वाली एक गज़िल फाइलें हैं /var/lib/dpkg/info/*.list- ऊपर दिए गए क्वेरी को किसी अन्य सिद्धांत के तहत फिर से लिखना होगा।
पैत्रिस लेवेस्क

6

का एक और अधिक कुशल संस्करण @ पैट्रिस के समाधान , प्रक्रिया प्रतिस्थापन के लिए समर्थन (के साथ एक खोल का उपयोग करते हुए bash, एटी एंड टी 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/और अन्य सिस्टम विभाजन को देखने का भी लाभ है ।
n

3

चूँकि आपने टैग किए गए debianस्पष्ट विकल्प के साथ सवाल किया था , जिसका उपयोग अभी तक नहीं किया गया है, cruft-ngअगर आपको किसी लचीलेपन की आवश्यकता नहीं है या cruftयदि आप पूरे सिस्टम / स्थित के माध्यम से खोज नहीं करना चाहते हैं।


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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.