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


30

สำหรับการอัปเกรดที่ราบรื่นจาก 10.04 เป็น 10.10 ฉันต้องการลบแพ็คเกจทั้งหมดที่ไม่อยู่ในที่เก็บข้อมูลเริ่มต้น (เช่น Chromium PPA และที่เก็บของบุคคลที่สาม) เป็นวิธีที่ง่ายที่สุด (ควร CLI) เพื่อค้นหาและลบแพคเกจเหล่านี้คืออะไร?

แก้ไข: คำถามนี้ไม่ได้ จำกัด อยู่ที่ PPA ของฉันมีที่เก็บ x2go ด้วยดังนั้นฉันกำลังมองหาคำสั่งทั่วไปเพื่อลบแพ็คเกจที่เป็นของที่เก็บบางแห่ง สำหรับ PPA's คำถามที่ว่า PPA จะถูกลบออกได้อย่างไรมีคำตอบที่ดี


สำหรับผู้ที่ต้องการลบแพ็คเกจภายนอกทั้งหมดปิดการใช้งาน PPA ทั้งหมดและใช้code.google.com/p/apt-downgrade
Lekensteyn

คำตอบ:


12

สคริปต์นี้สามารถแสดงรายการแพ็กเกจทั้งหมดจากเซิร์ฟเวอร์ / สาขาเฉพาะ (การแก้ไขตัวแปรที่ประกาศสองตัว):

#!/bin/bash

server="http://it.archive.ubuntu.com/ubuntu/"
branch="maverick-updates/main"

apt-cache policy $(dpkg -l | awk 'NR >= 6 { print $2 }') |
  awk -v server="$server" -v branch="$branch" \
    '/^[^ ]/      { split($1, a, ":"); pkg = a[1] }
    nextline == 1 { nextline = 0; if ($2 == server && $3 == branch) print pkg }
    /\*\*\*/      { nextline = 1 }'

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

nextline == 1 { nextline = 0; if ($2 != server) print pkg }

1
ไม่ใช่สิ่งที่ฉันกำลังมองหาอย่างแน่นอนสคริปต์นี้เพียงแสดงแพ็คเกจทั้งหมดจากรายการที่เก็บข้อมูลเฉพาะ เมื่อแทนที่$2 == server && $3 == branchด้วย$2 != serverคำถามของฉันจะได้รับคำตอบ โปรดใส่คำตอบของคุณ :) ( branch=บรรทัดสามารถลบออกได้) หมายเหตุ: สันนิษฐานว่าแพ็คเกจทั้งหมดมาจากเซิร์ฟเวอร์ที่เก็บข้อมูลเดียว
Lekensteyn

1
สคริปต์นี้ (แก้ไขเล็กน้อยต่อความคิดเห็นครั้งสุดท้ายของฉัน) ทำงานตามที่คาดไว้ libvpx0แพคเกจที่มีอยู่ทั้งใน repo หลักใน PPA โครเมียมในชีวิตประจำวัน หลังจากลบที่เก็บจากผมมียังคงเป็นแพคเกจซ้ายมากกว่า:/etc/apt/sources.list.d libvpx0ฉัน "ซ่อมแซม" ดังต่อไปนี้: ลบห้องสมุดกับ dpkg sudo dpkg --ignore-depends=libvpx0 --remove libvpx0ละเว้นการอ้างอิง: ถัดไปติดตั้งอีกครั้งจาก repo sudo apt-get install libvpx0หลัก:
Lekensteyn

1
@Lekensteyn: บางทีคุณอาจทำให้งานของคุณสั้นลงโดยsudo apt-get install libvpx0=$version_stringสมมติว่าทั้งสองแพคเกจที่พร้อมใช้งานมีสตริงรุ่นที่แตกต่างกัน
enzotib

แน่นอนว่าเป็นไปได้เช่นกันและอาจดีขึ้นเช่นกัน
Lekensteyn

ฉันแค่ต้องตรวจสอบว่าแพ็คเกจใดไม่ได้ติดตั้งจาก repos เริ่มต้น คำสั่งapt-cache policy $(dpkg -l | awk '/^ii/{print $2}') > policy.txt; awk '!/^ /{pkg=$1}check{print pkg, $2;check=0}/\*\*\*/{check=1} ' policy.txt | grep -v archive.ubuntuเป็นการเริ่มต้นที่ดี (เพิ่มมากขึ้นgrep -vเพื่อยกเว้น PPA ที่แน่นอน) แพคเกจรุ่นที่ไม่เป็นที่รู้จักใน repo ใด ๆ /var/lib/dpkg/statusแสดงขึ้นเป็น
Lekensteyn

22

ตรวจสอบppa ล้างติดตั้ง ppa-purge

การใช้งาน:

ppa-purge -purge <nameofppa> [-s hostserver]

ค่าเริ่มต้น Hostserver ppa.launchpad.netไป

นี่คือลิงค์ไปยังmanpage สำหรับppa-purgeคำสั่งไอคอน Manpageสำหรับการอ้างอิง


หรือคุณสามารถใช้ ppa-purge ของฉันซึ่งมีการแก้ไขข้อผิดพลาดและการปรับปรุงมากกว่า ppa-purge ใน repository ของจักรวาล ดูที่นี่สำหรับข้อมูลเพิ่มเติม
jarno

18

การเอาชนะaptitudeMultiarch Bug ของppa-purge

โดยปกติตามที่Vadim RutkovskyและTakkatได้อธิบายไว้การรันppa-purgeด้วยไวยากรณ์เริ่มต้นเป็นวิธีที่มีประสิทธิภาพในการลบแพ็คเกจทั้งหมดที่ PPA จัดหาให้โดยปรับลดรุ่นเป็นรุ่นที่ให้ไว้ในแหล่งซอฟต์แวร์อื่น ๆ

อย่างไรก็ตามตามที่ Takkat ได้ชี้ให้เห็นข้อผิดพลาด 831768ป้องกันไม่ให้ppa-purgeทำงานอย่างถูกต้องเพื่อลบหลายแพคเกจ (เช่นแพคเกจ 32 บิตที่ติดตั้งบนระบบ 64- บิต) นี่เป็นเพราะaptitudeไม่สามารถจัดการการพึ่งพาที่ขัดแย้งกันในแพคเกจ multiarch (นั่นคือสิ่งที่เป็นข้อผิดพลาดเกี่ยวกับ) และพฤติกรรมเริ่มต้นของppa-purgeคือการใช้aptitudeเพื่อปรับลดแพคเกจ

โชคดีที่ppa-purgeยอมรับการ-iตั้งค่าสถานะซึ่งทำให้มันชอบที่apt-getจะaptitudeเป็นแบ็กเอนด์ ในฐานะที่เป็นบันทึกไว้ในรายงานข้อผิดพลาดที่ใช้apt-getเป็นทางเลือกที่มีประสิทธิภาพในการกล่าวอ้างด้วยตนเองaptitudeเพื่อให้ทำงานppa-purgeกับ-iธงควรจะเป็นวิธีแก้ปัญหาที่มีประสิทธิภาพสำหรับการลบ / ปรับลดทุกแพคเกจให้บริการโดย PPA รวมทั้งแพคเกจ

ทำอย่างไร

นี่คือไวยากรณ์:

sudo ppa-purge -i ppa:ppaowner/ppaname

ตามปกติ (เช่นเดียวกับเมื่อ-iไม่ได้ใช้แฟล็ก):

  • ppaowner จะถูกแทนที่ด้วยเจ้าของ PPA
  • /ppanameเป็นตัวเลือก หากปัจจุบันppanameถูกแทนที่ด้วยชื่อของ PPA ppaถ้าไม่เป็นค่าเริ่มต้น

ตัวอย่างเช่นสมมติว่าผมมีสัญญาซื้อขายไฟฟ้าสำหรับเสถียรสร้างของ qBittorrentติดตั้งและฉันต้องการที่จะลบออกอย่างสมบูรณ์โดยอัตโนมัติปรับลด qBittorrent กับสิ่งที่รุ่นสามารถใช้ได้ผ่านแหล่งซอฟแวร์อื่น ๆ ของฉันโดยใช้apt-getaptitudeฉากหลังแทน จากนั้นฉันก็จะวิ่ง:

sudo ppa-purge -i ppa:hydr0g3n/qbittorrent-unstable

เอกสารอยู่ที่ไหน

ด้วยเหตุผลบางอย่างเป็นตัวเลือกที่มีประโยชน์บางประการสำหรับการppa-purgeไม่ได้บันทึกไว้ในหน้าคู่มือของตน-iรวมทั้ง แต่คุณสามารถรับข้อมูลเกี่ยวกับพวกเขาได้ด้วยการเรียกใช้ppa-purge -h(หรือเพียงแค่ppa-purgeไม่มีข้อโต้แย้ง):

ek@Del:~$ ppa-purge -h
Usage: sudo ppa-purge [options] <ppa:ppaowner>[/ppaname]

ppa-purge will reset all packages from a PPA to the standard
versions released for your distribution.

Options:
    -p [ppaname]        PPA name to be disabled (default: ppa)
    -s [host]       Repository server (default: ppa.launchpad.net)
    -d [distribution]   Override the default distribution choice.
    -y          Pass -y --force-yes to apt-get or -y to aptitude
    -i          Reverse preference of apt-get upon aptitude.
    -h          Display this help text

Example usage commands:
    sudo ppa-purge xorg-edgers
    will remove https://launchpad.net/~xorg-edgers/+archive/ppa

    sudo ppa-purge -p xorg-testing sarvatt
    will remove https://launchpad.net/~sarvatt/+archive/xorg-testing

    sudo ppa-purge ppa:ubuntu-x-swat/x-updates
    will remove https://launchpad.net/~ubuntu-x-swat/+archive/x-updates

Notice: If ppa-purge fails for some reason and you wish to try again,
(For example: you left synaptic open while attempting to run it) simply
uncomment the PPA from your sources, run apt-get update and try again.

"การตั้งค่าแบบย้อนกลับของ apt-get on aptitude" เป็นความลับเล็กน้อย โดยดูที่ชิ้นส่วนที่เกี่ยวข้องของรหัสที่มา ( ppa-purgeเป็นเพียงเชลล์สคริปต์หลังจากทั้งหมด) เราจะเห็นว่าวิธีการนี้ว่าพฤติกรรมเริ่มต้นคือการต้องการaptitudeที่จะapt-getและ-iฝืนธงการตั้งค่านี้


ครั้งสุดท้ายเมื่อฉันพยายาม ppa-purge มันไม่ได้ลบแพ็คเกจที่ถูกลบออกจาก PPAs ยังคงเป็นกรณี?
Lekensteyn

@Lekensteyn ใช่ฉันเชื่อว่ามันยังคงเป็นกรณีที่ppa-purgeจะไม่ลบหรือปรับลดแพ็คเกจที่ PPA ไม่ได้ให้ "กำจัด" อีกต่อไป อย่างไรก็ตามคุณอาจต้องการโพสต์คำถามแยกต่างหากเกี่ยวกับเรื่องนี้เพื่อรับคำตอบที่เชื่อถือได้หรือมีเอกสารดี
Eliah Kagan

หากพื้นที่เก็บข้อมูลไม่ใช่ PPA ที่โฮสต์ใน Launchpad แต่เป็นพื้นที่เก็บข้อมูลที่ไม่ได้มาตรฐานอื่น ๆ ppa-purge จะทำงานได้หรือไม่
อันวาร์

1
@Anwar ฉันไม่ดีถ้ามันจะทำงาน แต่คุณควรจะสามารถที่จะลองโดยการระบุ URL ppa:username/pathพื้นที่เก็บข้อมูลเต็มรูปแบบแทน PPA จะต้องถูกเปิดใช้งานก่อนที่คุณจะพยายามกำจัดแม้ว่าสคริปต์จะปิดใช้งานทันทีหลังจากอัปเดตรายชื่อของแพ็คเกจที่จะลบ แต่จะไม่ "ค้นหา" ปิดใช้งาน PPA
dragon788

1
@Lekensteyn คุณสามารถลองใช้aptitude search ~oเพื่อค้นหาแพคเกจกำพร้าที่ไม่มีแหล่งการติดตั้งหากคุณต้องการกำจัดบางสิ่งที่ถูกลบออกจาก PPA (หรือถูกติดตั้งเป็นหนึ่งผ่านdpkg -i)
dragon788

6

นี่คือวิธีทำ GUI หวังว่ามันจะช่วยสำหรับผู้ที่ไม่ชอบ CLI ขั้นตอนนั้นง่ายและสะดวกในการติดตาม

  1. เปิดแพคเกจผู้จัดการ synaptic หากไม่ได้ติดตั้งให้ติดตั้งโดย:

    sudo apt-get install synaptic
    
  2. เมื่อเปิดคลิกที่ปุ่มOriginทางด้านซ้ายมือ มันจะแสดงรายการที่เก็บข้อมูลทั้งหมดที่ด้านซ้ายบน เลือกพื้นที่เก็บข้อมูลเฉพาะที่จะลบแพคเกจ มันจะแสดงรายการแพคเกจทั้งหมดภายใต้พื้นที่เก็บข้อมูลนั้น คลิกฟิลด์แรก i, e Sหรือเวอร์ชันที่ติดตั้งเพื่อแสดงแพ็คเกจที่ติดตั้งไว้ก่อน

  3. ตอนนี้เลือกแพ็คเกจทั้งหมดเพื่อลบ

    เคล็ดลับในการทำเครื่องหมายเพื่อลบ:

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

    2. หรือเลือกแพ็คเกจใด ๆ แล้วกดCtrl+ Aเพื่อเลือกทั้งหมด จากนั้นคลิกขวาที่กล่องสี่เหลี่ยมและเลือกเครื่องหมายเพื่อลบหรือทำเครื่องหมายเพื่อลบออกโดยสมบูรณ์

แค่นั้นแหละ. มันจะลบโดยไม่มีปัญหาใด ๆ ฉันแนบรูปภาพเพื่อทำให้ชัดเจนยิ่งขึ้น หวังว่ามันจะช่วย :)

ภาพ


5

อย่างน้อยพบพวกเขาเริ่มต้นด้วยการปิดการใช้งานของ PPA apt-get updateและเรียกใช้ apt-show-versionsแล้วติดตั้ง การทำงานapt-show-versions | grep 'No available'จะแสดงรายการแพ็คเกจที่ติดตั้งทั้งหมดของคุณซึ่งไม่พบในที่เก็บที่กำหนดค่าไว้ ด้วยเวทมนตร์บรรทัดคำสั่งบางอย่างคุณสามารถดึงชื่อแพ็กเกจออกมาเท่านั้นและส่งต่อไปยังapt-get remove:

 for i in `apt-show-versions | grep 'No available' | cut -d' ' -f 1` ; do  sudo apt-get remove -y $i ; done

โปรดทราบว่านี่จะผ่านรายการที่ส่งคืนจากapt-show-versionsและลบออกทีละรายการ ขึ้นอยู่กับสิ่งที่พบสิ่งนี้สามารถถอนการติดตั้งสิ่งที่ไม่ได้ตั้งใจเนื่องจากการอ้างอิงดังนั้นตรวจสอบก่อน


ฟังดูดีฉันจะลองดู
Lekensteyn

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

@ จอร์จ: ฉันสังเกตเห็นจริง ๆ ว่า PPA ถูกปิดใช้งาน (แสดงความคิดเห็น) แต่มันไม่ได้ลบแพคเกจ ฉันคิดว่าเป็นการดีกว่าที่จะลบแพ็กเกจก่อนที่จะมีเวอร์ชั่นใหม่จากที่เก็บของ Ubuntu เขียนทับไฟล์
Lekensteyn

ฉันเพิ่งทดสอบสิ่งนี้และมันไม่ได้แยกความแตกต่างระหว่างแพ็คเกจจาก repos หลักและ PPA ในกรณีของฉันมันเป็นlibvpx0แพคเกจจาก PPA โครเมียมทุกวัน คำตอบของ @ enzotib แสดงแพคเกจนี้แล้ว
Lekensteyn

หากคุณทำงานapt-show-versionsที่ไม่ใช่รูทจำเป็นต้องsudo apt-show-versions -iอัปเดตแคชและดูการเปลี่ยนแปลงจากที่เก็บ / PPAs ที่เพิ่งลบใหม่ (มิฉะนั้นจะอัปเดตผ่านงาน cron.daily เท่านั้น)
Xen2050

0

ฉันพบว่าการใช้ ppa-purge นั้นยาก

เปิดตัวจัดการแพคเกจ Synaptic ภายใต้ระบบจากนั้นเลือกการตั้งค่าที่เก็บ

ลบสิ่งที่คุณไม่ต้องการ

ทำ!


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