จะค้นหาไฟล์ที่ไม่ได้เป็นเจ้าของโดยแพ็คเกจใด ๆ ได้อย่างไร?


12

ในระบบของฉันฉันมีแฟ้มที่ได้อยู่ในแพคเกจใด ๆ make installพวกเขาเป็นของเราหรือจากโปรแกรมที่รวบรวมการติดตั้งด้วย ฉันจะค้นหาไฟล์ทั้งหมดที่ไม่ได้เป็นของแพ็คเกจใด ๆ ได้อย่างไร

คำตอบ:


10

ใน/var/lib/dpkg/infoเป็น.listไฟล์ข้อความที่แสดงรายการไฟล์ทั้งหมดที่มีอยู่ในแต่ละแพคเกจ¹ติดตั้งผ่านผู้จัดการแพคเกจของ Debian

การค้นหาไฟล์ทั้งหมดในระบบไฟล์ไม่ตรงกับรายการใด ๆ ที่สามารถทำได้ด้วยบางสิ่งที่ไร้ค่าเช่นนี้:

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

เห็นได้ชัดว่าใช้เวลานานมากเนื่องจากระบบไฟล์ทั้งหมดจะถูกสแกน ถ้าคุณใช้พาร์ทิชันที่แตกต่างกันสำหรับไดเรกทอรีระบบ (เช่น/usrหรือ/var) /ระบุพวกเขาหลังจากที่เริ่มต้น

คำเตือน: ไม่รวมไฟล์ที่สร้างโดยแพ็คเกจสคริปต์ ตัวอย่างเช่น

  • /etc/hosts.allowไม่ได้แสดงไว้ที่ใดก็ได้ แต่อาจมาจากlibwrap0สิ่งที่สร้างขึ้นหากไฟล์นั้นไม่มีอยู่ในขณะที่ทำการติดตั้งแพ็คเกจ
  • ไฟล์จำนวนมากถูกคอมไพล์ระหว่างการติดตั้งเช่น.pycไฟล์ (ไลบรารี Python ที่คอมไพล์แล้ว), .elcไฟล์ (คอมไพล์ Emacs Lisp librarires) เป็นต้น
  • ...

ข้อผิดพลาดfind: argument list too long
naught101

@ naught101 นั่นแสดงให้เห็นว่ามีการจับคู่ไฟล์ gazillion /var/lib/dpkg/info/*.list- แบบสอบถามข้างต้นจะต้องมีการเขียนใหม่ภายใต้หลักการอื่น ๆ
Patrice Levesque

6

โซลูชันที่มีประสิทธิภาพมากขึ้นของ@ Patriceโดยใช้เชลล์ที่รองรับการทดแทนกระบวนการ ( bash, AT&T ksh, zsh):

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

เช่นเดียวกับวิธีการแก้ปัญหาของ Patrice ไม่มีข้อสันนิษฐานว่าพา ธ ไฟล์มีอักขระขึ้นบรรทัดใหม่


1
การใช้locateฐานข้อมูลจะเร็วกว่าการรันfindไหม locate \* | grep -v "^/home/"- ยังมีประโยชน์ในการค้นหา/boot/และพาร์ติชันระบบอื่น ๆ
naught101

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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.