ฉันจะรับรายการแพ็กเกจที่ล้าสมัยได้อย่างไร


19

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

คำตอบ:


23
aptitude search '~o'

ความถนัดมีการค้นหาที่ทรงพลังมาก น่าเสียดายที่ไวยากรณ์นั้นค่อนข้างลำบากและคุณต้องขุด manpage เพื่อค้นหาเอกสาร แต่มันก็คุ้มค่า

apt-show-versions ยังมีประโยชน์:

apt-show-versions | grep 'No available version'

1
ดูบทความที่ดีเกี่ยวกับแพคเกจล้าสมัยที่นี่: raphaelhertzog.com/2011/02/07/ …
Lluís

รายการที่มีประโยชน์อื่นถูกสร้างโดยapt-show-versions | grep "newer than version in archive"
Sean

ฉันคิดว่า apt-show-versions นั้นดีที่สุดเพราะบรรทัด aptitude นั้นตอบโต้ได้ง่ายมากที่จะจำ ทุกครั้งที่ฉันต้องการฉันต้อง google / ค้นหา / บันทึก / สร้างสคริปต์ / ฯลฯ
j riv

6

ในการรับรายการแอพที่ไม่ได้อยู่ในพื้นที่เก็บข้อมูลที่ลงทะเบียนหรือ PPA ให้ทำดังนี้

sudo apt-get install apt-show-versions
apt-show-versions | grep 'No available version'

ควรให้ข้อความเป็นดังนี้:

app1 1.0.0.14 installed: No available version in archive
app23 0.3.6 installed: No available version in archive
app332 7.0.9377 installed: No available version in archive

สำหรับฉันแล้วสิ่งนี้ทำงานได้และแสดงแอพสามตัวที่ฉันติดตั้งโดยใช้แพ็คเกจ DEB และไม่มีใน Repo หรือ PPA

โปรดจำไว้ว่าเป็นไปไม่ได้ที่จะตรวจสอบโปรแกรมทั้งหมดเฉพาะโปรแกรมที่ผ่านไปdpkgเท่านั้น ตัวอย่างเช่นแอพบางตัวได้รับการติดตั้งโดยการแยกมันเข้าไปในโฟลเดอร์ที่ถูกต้องมิฉะนั้นแอปอื่น ๆ ก็ใช้ bin หรือสคริปต์ตัวติดตั้งแบบสแตนด์อโลน ดังนั้นวิธีที่ดีที่สุดคือให้คุณเก็บรายการแอพที่คุณติดตั้งด้วยวิธีอื่นนอกเหนือจาก APT


ใช้ได้กับdpkgแพ็คเกจที่ติดตั้งในเครื่องของฉัน ข้อยกเว้นหนึ่งข้อ มันแสดงรายการskype-binในขณะที่apt-cache policy skype-binแสดงให้เห็นชัดเจน repo พันธมิตร Canonical ฉันไม่แน่ใจว่าเกิดอะไรขึ้น ปัญหา Multiarch? ยัง +1 สำหรับapt-show-versions!
gertvdijk

ความถนัดเรียกแพคเกจ 'ล้าสมัย' เหล่านี้ ดูความคิดเห็นของ chronitis ด้านบน
Henk Poley

5

หากคุณมีความถนัดในการใช้งาน

aptitude search '?obsolete'

หรือรูปแบบสั้น ๆ

aptitude search '~o'

นี่คือตัวอย่างผลลัพธ์

i A gcc-4.7-base - GCC, the GNU Compiler Collection (base package)
id  libdb4.7     - Berkeley v4.7 Database Libraries [runtime]
i   libudev0     - libudev shared library

อักขระตัวแรกของแต่ละบรรทัดบ่งชี้สถานะปัจจุบันของแพ็คเกจ รัฐที่พบมากที่สุดคือ:

  • p, หมายความว่าไม่มีร่องรอยของแพ็คเกจอยู่บนระบบ
  • c, หมายความว่าแพ็กเกจถูกลบ แต่ไฟล์การกำหนดค่ายังคงอยู่ในระบบ
  • ฉันหมายถึงแพคเกจที่ติดตั้งและ
  • v หมายถึงแพคเกจเสมือน

อักขระตัวที่สองระบุถึงการดำเนินการที่เก็บไว้ที่จะดำเนินการบนบรรจุภัณฑ์ (ถ้ามี) มิฉะนั้นจะมีการแสดงพื้นที่ว่าง การกระทำที่พบบ่อยที่สุดคือ:

  • ฉันหมายถึงแพ็คเกจจะถูกติดตั้ง
  • d, หมายถึงแพ็คเกจจะถูกลบและ
  • p หมายถึงแพ็กเกจและไฟล์การกำหนดค่าจะถูกลบออก

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

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


1
aptitude search ?obsoleteอาจทำงานได้ในทุบตี แต่คุณควรใช้aptitude search '?obsolete'
AB

คุณสามารถเพิ่มรายละเอียดเกี่ยวกับการแยกวิเคราะห์ผลลัพธ์ได้หรือไม่
Elder Geek

เป็น 'ล้าสมัย' แตกต่างจาก '~ o' หรือไม่
Sean

@ เซียนไม่พวกเขาไม่ต่างกัน ~ o เป็นรูปแบบย่อสำหรับ? ล้าสมัยจริง ๆ
Demis Palma ツ

คำพูดจะถูกแยกออกโดยเปลือก ฉันคิดว่าสิ่งที่ AB หมายถึงคือคุณไม่ควรผ่านตัวละครแปลก ๆ ที่ไม่ใช้ Escape ในบรรทัดคำสั่งเพราะคุณไม่รู้ว่าเชลล์ของคุณทำอะไรกับพวกเขา
ฌอน

2

เริ่มต้นด้วย Ubuntu 19.10 มันเป็นไปได้ที่จะเรียกใช้

apt list ?obsolete

เพื่อรับรายการแพคเกจที่ล้าสมัย

สำหรับรุ่นใด ๆ คุณสามารถใช้ Bash one-liner ต่อไปนี้:

comm -23 <(dpkg-query -W -f '${db:Status-Abbrev}\t${Package}\n' | grep '^.[^nc]' | cut -f2 | sort) <(apt-cache dumpavail | sed -rn 's/^Package: (.*)/\1/p' | sort -u)

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

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

ใช้ฉลาดทันสมัย:

 apt list --installed | awk -F/ '/\[installed,local\]/{print $1}'

อีกตัวเลือกหนึ่งคือการทำงาน

ubuntu-support-status --show-unsupported

และอ่านชื่อแพ็คเกจภายใต้หัวข้อ "ไม่สามารถดาวน์โหลดได้อีก:"


รายการ apt - ติดตั้งด้วยตนเอง | grep -v cosmic 'แสดงผลบวกผิดพลาด คำตอบนี้ดีกว่ามาก!
TamusJRoyce

1
@ TamusJRoyce ใช่ฉันคิดว่าตอนนี้หลังจากแก้ไข
jarno

1

ข้อมูลเพิ่มเติมเพื่อตรวจสอบ

อูบุนตูสนับสนุนสถานะ 
echo "แพคเกจ $ (sudo apt-mark showmanual | wc -l) ที่ทำเครื่องหมายว่า 'ติดตั้งด้วยตนเอง'"

... ubuntu-support-status และ apt-mark อาจต้องติดตั้ง


ไม่จำเป็นต้องใช้ด้วยsudo apt-mark showmanual
jarno

ubuntu-support-statusแสดงจำนวนแพ็กเกจที่ล้าสมัย แต่ไม่ใช่ชื่อแพ็กเกจ
jarno

1
อ่านผลลัพธ์ของubuntu-support-status --help
Hannu

โอ้ขอบคุณสำหรับคำใบ้
jarno

0

อาจมีวิธีที่สะอาดกว่านี้ แต่ปิดส่วนบนของหัวฉันได้

dpkg -l | cut -f 3 -d ' ' > installed
xargs -n 1 --replace=X apt-cache search ^X$ < installed | cut -f 1 -d ' ' > available
diff installed available

ล้างข้อมูลสองสามบรรทัดแรกของinstalledไฟล์: มันจะมีส่วนหัว

โบนัสถ้าใครสามารถแก้ไขการเน้นไวยากรณ์ของฉัน ...


2
หากคุณกำลังจะใช้เอาต์พุตของdpkg -lเพื่อรับรายการแพ็กเกจที่ติดตั้งคุณควร จำกัด ผลลัพธ์เป็นบรรทัดที่มี 'i' ในคอลัมน์ที่สองเนื่องจาก dpkg จะแสดงรายการแพ็กเกจที่ไม่ได้ติดตั้ง (อาจถูกลบออก . ตัวอย่างเช่นการแก้ไขคำสั่งแรกของคุณเพื่อที่dpkg -l | grep '^.[^i]' | cut -f 3 -d ' ' จะส่งคืนรายการแพ็กเกจซึ่งไม่ได้ติดตั้ง (แต่ครั้งหนึ่งเคยเป็น)
สตูว์

1
อีกทั้งapt-cache search someinstalledpackageจะส่งคืนบางสิ่งแม้ว่าแพคเกจจะไม่พร้อมใช้งานจาก repo ดังนั้นฉันไม่เชื่อว่าสิ่งนี้จะใช้งานได้เลย
เคี่ยว

1
@stew ฉันจะออกจากที่นี่เพื่อดูว่าใครจะได้ข้อสรุป แต่คำตอบของคุณดีกว่าแน่นอน +1 ถึงคุณ
Jeff Ferland

@stew dpkg -l | grep '^.[^i]' | cut -f 3 -d ' 'ยังพิมพ์บรรทัดส่วนหัวบางส่วน
jarno

แม้ว่าคำตอบนี้จะใช้งานได้มันจะช้ามากapt-cache searchเพราะแต่ละแพ็คเกจแยกกัน
jarno

0

การค้นหา apt-get ดังกล่าวไม่ใช่วิธีที่ดีในการตรวจสอบว่ามีแพ็คเกจอยู่หรือไม่ เพิ่มเติมฉันเพิ่มทุกอย่างลงในบรรทัดเดียว:

for i in `dpkg -l | grep '^i' | awk '{ print $2 }'`; do apt-cache show $i > /dev/null || echo $i; done

และทำไมgrep '^i'
AB

@ จุดที่ดี AB; ที่ไม่ได้บอกถ้าติดตั้งแพคเกจ แต่ต้องติดตั้งการกระทำที่ต้องการของแพคเกจ ดูman dpkg-queryข้อมูลเพิ่มเติม
jarno

ช้ามาก
jarno

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