ในระบบของฉันฉันมีแฟ้มที่ได้อยู่ในแพคเกจใด ๆ make install
พวกเขาเป็นของเราหรือจากโปรแกรมที่รวบรวมการติดตั้งด้วย ฉันจะค้นหาไฟล์ทั้งหมดที่ไม่ได้เป็นของแพ็คเกจใด ๆ ได้อย่างไร
ในระบบของฉันฉันมีแฟ้มที่ได้อยู่ในแพคเกจใด ๆ make install
พวกเขาเป็นของเราหรือจากโปรแกรมที่รวบรวมการติดตั้งด้วย ฉันจะค้นหาไฟล์ทั้งหมดที่ไม่ได้เป็นของแพ็คเกจใด ๆ ได้อย่างไร
คำตอบ:
ใน/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) เป็นต้น/var/lib/dpkg/info/*.list
- แบบสอบถามข้างต้นจะต้องมีการเขียนใหม่ภายใต้หลักการอื่น ๆ
โซลูชันที่มีประสิทธิภาพมากขึ้นของ@ 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 ไม่มีข้อสันนิษฐานว่าพา ธ ไฟล์มีอักขระขึ้นบรรทัดใหม่
locate
ฐานข้อมูลจะเร็วกว่าการรันfind
ไหม locate \* | grep -v "^/home/"
- ยังมีประโยชน์ในการค้นหา/boot/
และพาร์ติชันระบบอื่น ๆ
เนื่องจากคุณติดแท็กคำถามของคุณด้วยdebian
ตัวเลือกที่ชัดเจนซึ่งยังไม่ได้กล่าวถึงคือการใช้cruft-ng
หากคุณไม่ต้องการความยืดหยุ่นใด ๆ หรือcruft
หากคุณไม่ต้องการค้นหาทั้งระบบ / ที่อยู่
นอกจากนี้คุณยังสามารถใช้ขั้นตอนเปลี่ยนตัว & &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)
find: argument list too long