ค้นหาแพ็คเกจที่ติดตั้งจากที่เก็บที่แน่นอนด้วยความถนัด


39

ฉันกำลังค้นหาสิ่งที่คล้ายคลึงกับคำถามนี้: Zypper: ฉันจะแสดงแพคเกจทั้งหมดจากพื้นที่เก็บข้อมูลที่แน่นอนได้อย่างไร

ตั้งแต่ฉันอยู่บน Ubuntu ฉันต้องการโซลูชันที่ใช้ความถนัด: ฉันจะรับรายการแพคเกจที่ติดตั้งจากที่เก็บบางแห่งได้อย่างไร

คำตอบ:


17

การใช้ความถนัดเพื่อที่จะมองหาแพ็คเกจที่ติดตั้งอยู่นอกสาขาที่มั่นคงคุณสามารถใช้:

aptitude search "?narrow(?installed,?not(?archive(stable)))"

หากต้องการดูเวอร์ชันรวมถึงชื่อแพ็คเกจ (และแทนที่จะเป็นคำอธิบาย) คุณสามารถใช้คำสั่งพร้อมตัวเลือกการจัดรูปแบบ ( -Fสั้น ๆ ) ดังนี้

aptitude search -F "%p %V %v" "?narrow(?installed,?not(?archive(stable)))"

สำหรับรูปแบบเพิ่มเติมโปรดดูmanpage (เอกสารคู่มือพร้อมตัวเลือกที่มีประโยชน์ )

ที่ทำงานตัวอย่างเช่นใน Debian หากคุณติดตั้งแพคเกจนอกบีบ (โดย runing apt-get install -t sid package-nameยกตัวอย่างเช่น

คุณสามารถดูว่าแพคเกจที่ติดตั้งมาจากผ่านapt-cache policyการใช้งานเป็นดังนี้:

apt-cache policy <package-name>

ตัวอย่างเช่นแพคเกจหลาม -numpy ของฉันแสดงผลต่อไปนี้:

$ LANG=C apt-cache policy python-numpy
python-numpy:
  Installed: 1:1.6.2-1
  Candidate: 1:1.6.2-1.2
  Version table:
     1:1.7.0-1 0
          1 http://ftp.es.debian.org/debian/ experimental/main amd64 Packages
     1:1.6.2-1.2 0
        500 http://ftp.es.debian.org/debian/ sid/main amd64 Packages
 *** 1:1.6.2-1 0
        100 /var/lib/dpkg/status
     1:1.4.1-5 0
        990 http://ftp.es.debian.org/debian/ squeeze/main amd64 Packages
        990 http://ftp.de.debian.org/debian/ squeeze/main amd64 Packages

นั่นหมายความว่าฉันเป็นรุ่นหนึ่งที่อยู่ด้านหลัง sid / main ของสาขาดังนั้นฉันจึงติดตั้งเวอร์ชันเก่า ฉันเห็นฉันไม่ได้มีเสถียรภาพหนึ่งเพราะมันเป็นยังและฉันปัจจุบันอยู่ที่1.4.1-51.6.2-1

เมื่อส่งแพคเกจนี้ได้รับการปรับปรุงแล้ว:)


ฉันชอบ?any-version()เพราะ~narrow(pat1, pat2)มันเหมือนกัน?any-version(pat1 pat2)และรองรับได้?any-version(pat1 pat2 pat3)โดยไม่ต้องมองโง่
Robert Siemer

18

หลังจากอ่านหน้าข้อมูลความถนัดและความพยายามหลายสิบครั้งในที่สุดฉันก็ได้รับสิ่งนี้:

aptitude search '?narrow(?installed,?not(?archive(testing)) ?archive(unstable))'

หรือเทียบเท่า) :

aptitude search '~S ~i (!~Atesting ~Aunstable)'

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

หากคุณต้องการกรองแพ็คเกจที่ติดตั้งจาก www.debian-multimedia.org/unstable:

aptitude search '~S ~i (!~Atesting ~Aunstable ?origin("Unofficial Multimedia Packages"))

แก้ไข: "เก็บถาวร", "จุดเริ่มต้น" ฯลฯ จะถูกหักออกจากReleaseไฟล์ของที่เก็บ น่าเสียดายที่เครื่องมือบางอย่างนั้นไม่สามารถดูบรรทัดเหล่านั้นทั้งหมดและพวกเขาใช้ไวยากรณ์ที่แตกต่างกันสำหรับพวกเขา /var/lib/apt/lists/*Releaseคุณสามารถค้นหาไฟล์เหล่านั้นเป็น หรือเพียงพิมพ์apt-cache policyเพื่อดูภาพรวม apt-cache เปลี่ยนรูปแบบผลลัพธ์: รุ่นที่ใหม่กว่าใช้สไตล์ apt_preferences

  • Suite:หรือArchive:(ชื่อเก่า!)
    • การค้นหาความถนัด: ?archive(___)หรือ~A___
    • รูปแบบความถนัด: %t
    • apt_preferences: release a=___
    • อูบุนตูตัวอย่าง: natty-backports, trusty-security,stable
  • Origin:
    • การค้นหาความถนัด: ?origin(___)หรือ~O___
    • รูปแบบความถนัด: n / a
    • apt_preferences: release o=___
    • ตัวอย่างอูบุนตู: Canonical, Google, Inc., LP-PPA-dockbar-main,Ubuntu
  • บรรทัดอื่นทั้งหมด
    • ความถนัด: n / a

15

ตรวจสอบแท็กต้นทาง (เช่นo = Debian ) สำหรับที่เก็บปัจจุบันของคุณแต่ละแห่ง:

apt-cache policy | sed -n 's/.*o=\([^,]\+\).*/\1/p' | uniq

จากนั้นค้นหาแพ็คเกจจาก (หรือไม่จาก) ที่มาเฉพาะ:

aptitude search "?installed?origin(Debian)"
aptitude search "?installed?not(?origin(Debian))"

สิ่งนี้ไม่เหมาะสำหรับการตรวจสอบความปลอดภัยเนื่องจากต้องอาศัยที่เก็บข้อมูลแต่ละแห่งเพื่อให้ข้อมูลต้นทางของตนเอง แต่อาจเป็นประโยชน์สำหรับการแก้ไขปัญหาที่มาของแพ็กเกจที่มีอยู่ในที่เก็บหลายแห่ง


2
aptitude searchรูปแบบของคุณไม่ดี - พวกเขาเลือกเช่น“ แพ็คเกจรายการที่ติดตั้งรุ่นหนึ่งและรุ่นอื่น ๆ ที่มีอยู่ใน Debian” หรือ“ ติดตั้งบางรุ่นและอย่างน้อยหนึ่งรุ่นของแพคเกจนั้นมีให้บริการสำหรับผู้ที่ไม่ใช่เดเบียน” - สิ่งที่เรามองหาคือ“ เวอร์ชั่นที่ติดตั้งมาจาก Debian (หรือไม่)” นี้จะต้องมีการทำด้วยหรือ?narrow() ?any-version()
Robert Siemer

ได้รับการยืนยัน ฉันได้รับการติดตั้งnemo-filerollerจากlinuxmintแต่มันมีอยู่ในDebianมากเกินไป ดังนั้นจึงปรากฏในรายการเพราะติดตั้งแล้วและอยู่ที่ไหนสักแห่งจาก Debian
Boldewyn

6

เพื่อความสมบูรณ์: สำหรับระบบ Ubuntu คุณสามารถใช้ Synaptic สำหรับงานนี้ได้เช่นกัน ในคอลัมน์ด้านซ้ายคุณสามารถกรองแพ็คเกจตามที่มาของแพ็คเกจ


ฉันพยายามทำสิ่งนี้และพบว่าโพสต์ SU นี้ผ่าน Google ไม่น่าเชื่อว่าฉันจะมองข้าม Synaptic ขอบคุณ!
David Claridge

@RobertSiemer มันอาจลดความสนใจของคุณที่ฉันยอมรับมันหลังจากสองวันโดยไม่มีคำตอบที่เพียงพอและก่อนที่จะมีคำตอบอื่น ๆ ที่ลดลงมาฉันยอมรับมันเพราะมันแก้ปัญหาของฉัน ฉันยังตอบโต้คำตอบในภายหลังทั้งหมดแต่ฉันขอให้อภัยคุณไม่เคยเปลี่ยนสถานะของการยอมรับ คุณจะต้องทราบเกี่ยวกับคำถามที่พบบ่อยของเว็บไซต์นี้ว่าฉันไม่ได้รับชื่อเสียงใด ๆ จากการย้ายครั้งนี้ซึ่งในความเป็นจริงฉันแพ้ 2 reps เพราะไม่ยอมรับคำตอบของคนอื่น ดังนั้นโปรดย้อนกลับไปในอนาคตก่อนที่จะตัดสินการตัดสินใจของใครบางคนในที่สาธารณะและคิดทบทวนสาเหตุที่เป็นไปได้
Boldewyn

2

ฉันพบสิ่งนี้:

aptitude search "?origin (<repository>) ?installed"

นอกจากนี้คุณยังสามารถหารายชื่อของคำค้นหาที่ได้รับการสนับสนุนจาก "ค้นหาความถนัดเป็น" ที่นี่


ทำไมคุณต้องทำงานนี้ด้วยsudo? ดูเหมือนว่าฉันจะทำงานได้โดยไม่ต้องใช้มันในฐานะที่เป็นราก
Andre Holzner

ไม่จำเป็นต้องดำเนินการด้วย sudo
Kurtis Nusbaum

ตามที่ฉันแสดงความคิดเห็นกับ @Anonymous คำตอบนี่ไม่มีผลที่ต้องการ
Robert Siemer

2

ก่อนอื่นให้ค้นหาไฟล์ที่เหมาะสมสำหรับพื้นที่เก็บข้อมูลที่น่าสนใจใน / var / lib / apt / list มันเป็นไปได้ที่จะทำสิ่งนี้โดยทางโปรแกรม แต่ฉันไม่จำเป็นต้องทำ

ตัวอย่างการใช้ google chrome ลองทำสิ่งนี้:

SEARCH_PATTERN=dl.google.com_linux_chrome  # adjust to suit your needs

for PKG in $( grep-dctrl -sPackage . /var/lib/apt/lists/${SEARCH_PATTERN}_*_Packages | sed 's/^Package: //' )
do
    if dpkg -s "${PKG}" 2> /dev/null 1> /dev/null
    then
        echo ${PKG}
    fi
done

และฉันได้รับผลลัพธ์:

google-chrome-stable

dpkg -s ส่งคืนค่า 0 หากแพ็กเกจถูกติดตั้งและไม่ใช่ศูนย์มิฉะนั้น สำหรับวัตถุประสงค์ในการอ้างอิงในอนาคตผลลัพธ์ของ

grep-dctrl -sPackage . /var/lib/apt/lists/${SEARCH_PATTERN}_*_Packages

เป็น

Package: google-chrome-beta
Package: google-chrome-stable
Package: google-chrome-unstable

... สิ่งนี้ใช้ความถนัดได้หรือไม่?
Robert Siemer

2
@RobertSiemer มันเกี่ยวข้องกันอย่างไร? คำถามสมมติว่าคำสั่งที่เหมาะสมของภาษาอังกฤษคือวิธีการหาแหล่งที่มาของแพคเกจที่มีการติดตั้งที่มีความถนัด ไม่จำเป็นต้องมีวิธีแก้ปัญหาที่ใช้ความถนัด
Auspex

@Auspex ฉันเชื่อว่าเป็นอย่างอื่น - และไม่ต้องกังวลภาษาอังกฤษของฉันดีกว่า“ สมเหตุสมผล” เมื่อสองสามปีที่แล้ว
Robert Siemer

2
เห็นได้ชัดว่าไม่ใช่ ...
Auspex

2
@Auspex: คุณพยายามที่จะกระตุ้นฉันหรือไม่ สิ่งที่ตรงกันข้ามคือความจริง: คำถามกำลังถามหาวิธีแก้ไขตามความถนัดไม่ใช่สำหรับแพ็คเกจที่ติดตั้งด้วยความถนัด
Robert Siemer

0

คำตอบอื่น ๆ นั้นไม่ถูกต้องจริง ๆ เพราะพารามิเตอร์?archive()เป็นนิพจน์ทั่วไป ดังนั้น?archive(stable)ตรงกับทั้งสองและstable unstableหากต้องการยกเว้นเพียงstableคุณต้องยึดรูปแบบ regex:

aptitude search -F "%p %V %v %t" '?any-version(?installed ?not(?archive("^stable$")))'

หากต้องการยกเว้นที่เก็บหลายรายการ:

aptitude search -F "%p %V %v %t" '?any-version(?installed ?not(?archive("^(xenial|xenial-updates)$")))'

xenial-security,xenial-updatesนอกจากนี้ทราบว่าบางแพคเกจเป็นที่เก็บหลายเช่น ?archive()ประเมินรูปแบบ regex กับที่เก็บแต่ละรายการแยกกันดังนั้น?archive("^xenial-updates$")จะจับคู่แพ็กเกจใด ๆ ที่เป็นของxenial-updatesแม้ว่าจะเป็นของที่เก็บอื่น ๆ ด้วย

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