Có thể hoàn tác lệnh cài đặt apt-get không?


67

Tôi đã cài đặt Carpadio trên bản cài đặt Xubfox của tôi (USB trực tiếp), sau đó lấy hơn 50 gói từ, tôi cho rằng, phía Ubuntu của kho lưu trữ. Bây giờ tôi muốn hoàn tác điều này. Tuy nhiên, đối với tất cả các hoạt động săn bắn của tôi, tôi không thể tìm thấy bất cứ điều gì hữu ích hơn Làm thế nào tôi có thể đảo ngược lệnh sudo apt get install , điều này chỉ gợi ý apt-get purge. Điều này không hữu ích vì tất cả những gì nó làm là loại bỏ 2 gói (Carpadio và Carpadio-gnomepanel).

/var/log/apt/history.logcó một danh sách tất cả các gói đã được cài đặt cùng với lệnh đó. Vì vậy, tôi đã tự hỏi nếu có bất kỳ cách dễ dàng để đi về việc loại bỏ tất cả chúng ? Khác tôi chỉ có thể cài đặt lại, dù sao đây cũng là một bản cài đặt mới, nhưng tôi tò mò.

Một mẫu nhỏ của nhật ký lịch sử (1 / 5-1 / 10 của toàn bộ danh sách)

Dòng lệnh: apt-get cài đặt cardapio-gnomepanel
Cài đặt: libdbusmenu-qt2: amd64 (0.9.2-0ubfox1, tự động), python-packkit: amd64 (0.7.2-4ubfox3, tự động), cup-pk-helper: amd64 (0.2.1.2-1ub Ubuntu0.1, tự động) , geoclue: amd64 (0.12.0-1ubfox12, tự động), unity: amd64 (5.18.0-0ubfox1, tự động), máy in chỉ báo: amd64 (0.1.6-0ubfox1, tự động), libevolution: amd64 (3.2.3- 0ubfox6, tự động), libqt4-khai báo: amd64 (4.8.1-0ubfox4.3, tự động), libmtp9: amd64 (1.1.3-1ubfox0.1, tự động), tracker-miner-fs: amd64 (0.14.0-2ub Ubuntu1 , tự động), gir1.2-rb-3.0: amd64 (2.96-0ubfox4.2, tự động), python-aptdaemon.pkcompat: amd64 (0.43 + bzr805-0ub Ubuntu7, tự động), gnome-media: amd64 (3.4.0- 0ubfox3.1, tự động), metacity: amd64 (2.34.1-1ubfox11, tự động), nautilus: amd64 (3.4.2-0ubfox6, tự động), libcompizconfig0: amd64 (0.9.7.0 ~ bzr428-0ub Ubuntu6, tự động), compiz- plugin-mặc định:amd64 (0.9.7.12-0ubfox1, tự động), libunistring0: amd64 (0.9.3-5, tự động), libebackend-1.2-1: amd64 (3.2.3-0ubfox7, tự động), ubfox-docs: amd64 (12.04.6 , tự động), python-mako: amd64 (0.5.0-1, tự động),

Đối với tất cả những người đã đề xuất autoremove: Tôi không chắc tại sao, nhưng tôi chỉ nhận được 1 gói liên quan đến python khác (python-keybinder hoặc thứ gì đó) là "không cần thiết" và đó là tất cả những gì mà autoremove có thể loại bỏ.

Giữa cài đặt và gỡ cài đặt, chỉ có thay đổi lớn là cài đặt xubuntu-restricted-extras.


4
Sẽ hơi muộn để được giúp đỡ trong trường hợp này, nhưng lần tới khi bạn muốn cài đặt một cái gì đó, hãy xem xét việc mô phỏng trước. Chạy sudo apt-get install -s packageở nơi -sbiểu thị một mô phỏng và packagesẽ được thay thế bằng tên của phần mềm thích hợp.

@ vasa1 Vâng, tôi đang tự đánh bại mình về điều này. apt-get cũng hỏi [Y / n], đó đáng lẽ phải là của tôi ..
Karthik T

Tôi chỉ nhận được 1 gói liên quan đến python khác (python-keybinder hoặc summat) là "không cần thiết" Bạn có thực sự gỡ bỏ cardapio-gnomepanelgói không?
gertvdijk

@gertvdijk vâng, cũng apt-get remove carpadiomang cái đó theo.
Karthik T

1
@KarthikT Sau đó, tôi hoàn toàn thất vọng về lý do tại sao autoremovekhông làm việc cho bạn. Hoặc bằng cách nào đó bạn đã đánh dấu tất cả các gói là cài đặt thủ công bây giờ hoặc có một sự hiểu lầm rõ ràng. Rất đơn giản: apt-get autoremovechỉ cần xóa tất cả các gói được đánh dấu tự động mà không có lý do để có chúng ngay bây giờ. Nếu nó không phù hợp với bạn, tôi nghĩ bạn đã thay đổi điều gì đó trên hệ thống mà bạn không nói về câu hỏi của mình.
gertvdijk

Câu trả lời:


79

Về cơ bản, bạn sẽ phải cả hai apt-get remove(hoặc apt-get purge) gói chạy apt-get autoremovesau đó, để hoàn nguyên cài đặt package-one.

Hãy xem xét toàn bộ quá trình:

  • sudo apt-get install package-one cài đặt 50 phụ thuộc với nó được đánh dấu là "tự động" như có thể được nhìn thấy từ đoạn trích nhật ký trong câu hỏi của bạn

  • sudo apt-get purge package-one để loại bỏ việc (thanh trừng) chỉ là một, nhưng làm chạy này!

    Tất cả các hành động cài đặt sau (nếu bạn chạy bất kỳ) sẽ mang lại một thông báo thông tin với các gói không còn cần thiết:

    The following packages were automatically installed and are no longer required:
      package-two package-three [...]
    Use 'apt-get autoremove' to remove them.
    

    Danh sách này về cơ bản chỉ là một danh sách tất cả các gói được đánh dấu là "tự động" mà không phụ thuộc ngược vào chúng. Nói cách khác, không có lý do gì để chúng được cài đặt khi có liên quan đến việc quản lý gói.

    Lưu ý: Không cần cài đặt! Chỉ để chứng minh rằng APT rất thông minh để cho bạn biết về các gói không cần thiết của bạn!

  • sudo apt-get autoremove --purge loại bỏ (thanh trừng) những

Thêm thông tin


2
Trong OP này đã kéo vào Unity và tất cả bạn bè của nó. Tôi nghi ngờ thanh trừng cardapio sẽ loại bỏ Unity vv ngay cả sau khi autoremove.

@ vasa1 Tại sao? Các gói được đánh dấu là 'tự động cài đặt' (như có thể thấy trong câu hỏi) và nếu không tìm thấy lý do nào cho những gói được cài đặt trên hệ thống, chúng sẽ được đề xuất loại bỏ bằng cách sử dụng autoremove.
gertvdijk

Vâng, tôi đã tự hỏi về "tự động". Nếu điều đó phục vụ để chỉ ra autoremoval đó là tốt. OP không có vấn đề gì rồi.

@gertvdijk bắt tốt bởi @ vasa1, vui lòng xem chỉnh sửa của tôi. autoremoveđã không giúp được gì.
Karthik T

@gertvdijk, đối với "Các hành động cài đặt tiếp theo", liệu sudo apt-get updatecó đủ không?

19

Khi bạn muốn xóa một gói và các phụ thuộc được cài đặt tại thời điểm đó, bạn nên sử dụng:

sudo apt-get purge package
sudo apt-get --purge autoremove

nhưng để hoàn tác aptcác hành động, bạn có thể sử dụng apt-undotập lệnh. Đây là một tập lệnh đơn giản có thể hoàn tác các apthành động được thực hiện trong Ubuntu. Cần lưu ý rằng tập lệnh này chỉ có thể hoạt động nếu bạn sử dụng nó thay vì apt-getcài đặt / nâng cấp / gỡ bỏ / thanh lọc / hạ cấp các gói của bạn.

Để cài đặt apt-undotrong Ubuntu, hãy chạy các lệnh sau trong thiết bị đầu cuối:

sudo add-apt-repository ppa:lkjoel/apt-undo
sudo apt-get update
sudo apt-get install apt-undo

sử dụng:

apt-undo install yourpackages
apt-undo remove yourpackages
apt-undo purge yourpackages
apt-undo upgrade
apt-undo dist-upgrade
apt-undo install yourpackages=old.version
apt-undo install yourpackages=new.version

Để hoàn tác, các aptitudehành động trên chạy các lệnh sau trong thiết bị đầu cuối:

apt-undo undo

1
Cảm ơn, tôi đã xem qua cái này, và nó nghe giống như những gì bác sĩ đã yêu cầu, cho đến khi tôi thấy lời cảnh báo mà tôi cần sử dụng để cài đặt, để có thể hoàn tác ..
Karthik T

1
Bắt đẹp. Cú pháp rất khó hiểu, mặc dù. Và tôi thực sự không thích sử dụng các lựa chọn thay thế cho ứng dụng APT cốt lõi được thử nghiệm tốt. Vẫn +1!
gertvdijk

7

Sử dụng sức mạnh của Unix. Lấy dòng tệp nhật ký mà bạn có và xây dựng một lệnh sẽ hoàn tác những gì apt đã làm. Ví dụ:

$ echo 'Install: libdbusmenu-qt2:amd64 (0.9.2-0ubuntu1, automatic), python-packagekit:amd64 (0.7.2-4ubuntu3, automatic), cups-pk-helper:amd64 (0.2.1.2-1ubuntu0.1, automatic),'|perl -pe 's/ \(.*?\)//g; s/,//g; s/^Install: //'
libdbusmenu-qt2:amd64 python-packagekit:amd64 cups-pk-helper:amd64

Vì vậy, bạn có thể sử dụng thanh lọc tất cả các gói bạn đã cài đặt một cách tình cờ, đưa ra dòng thích hợp từ tệp nhật ký của bạn:

$ dpkg -P $(echo '(full log line here)' | perl -pe 's/ \(.*?\)//g; s/,//g; s/^Install: //')

(Tôi đã sử dụng perlthay sedsedsử dụng một loại biểu thức chính quy không hỗ trợ các kết quả không tham lam, đó là cách dễ nhất để xây dựng những gì tôi cần)


1
Kịch bản hay, nhưng nó thực sự chỉ là một chuỗi các lệnh mọi người có thể nhớ để hoàn thành nó.
gertvdijk

Cảm ơn, kịch bản đáng sợ, nhưng tôi sợ nó sẽ xảy ra với điều này
Karthik T

1
Tôi đã sử dụng mã rất giống nhau để giải quyết vấn đề rất giống nhau của tôi . Tôi đã làm điều đó trong vài bước chỉ để chắc chắn hơn về những gì đang xảy ra. Đầu tiên tôi đã sao chép khối văn bản có liên quan từ aptnhật ký vào một tệp mới và sau đó áp dụng nó cho nó: perl -pe 's/\(.*?\)(, )?//g' /path/to/apt-history.log Sau đó, tất cả những gì tôi đã làm là trả trước kết quả đầu ra đó sudo apt-get removevà tôi rất tốt để đi!
Insperatus

1

Sau khi bạn xóa một gói và bạn có thể xóa gói đó một cách triệt để bằng cách thêm --purge, for, apt-get remove --purge <package>nó sẽ cung cấp cho bạn một thông báo rằng các gói thư viện mà nó kéo vào được cài đặt tự động và không còn cần thiết nữa, tại thời điểm đó bạn có thể chạy apt-get autoremoveđến loại bỏ chúng


Cảm ơn, nhưng autoremove đã chứng minh là không đủ trong trường hợp này. Xin vui lòng xem chỉnh sửa của tôi.
Karthik T

1

Thực hiện theo các sudo apt-get purge packagenamevới

sudo apt-get autoremove. 

Trừ khi nó là siêu dữ liệu, điều này sẽ chăm sóc nó.

Đồng thời xem faq tại Làm cách nào để xóa thủ công tất cả các tệp Cardapio? .


Cảm ơn, nhưng autoremove đã chứng minh là không đủ trong trường hợp này. Xin vui lòng xem chỉnh sửa của tôi. Cảm ơn bạn đã liên kết FAQ, rất hữu ích!
Karthik T

1
Một số trong những gói đó có thể cần thiết bởi những thứ khác và không được đánh dấu là có thể tự động nhận. Bạn đã xem hướng dẫn tại liên kết? Những cái đó thế nào?
chaskes

Các hướng dẫn trên liên kết khá trực giao với vấn đề cốt lõi, và vì vậy, tôi đang nghiêng về việc cài đặt lại hệ thống của mình. dù sao cũng cảm ơn bạn.
Karthik T

1
  1. Dán danh sách dài các gói không mong muốn từ nhật ký apt vào new_file.txt
  2. Thi hành, hành hình perl -pe 's/\(.*?\)(, )?//g' /path/to/new_file.txt
  3. Sao chép đầu ra của lệnh cuối cùng vào bảng tạm hoặc đặt nó ở vị trí đầu tiên .
  4. Thực hiện sudo apt-get remove[dán nội dung của bảng tạm ở đây]

Làm xong.

Về cơ bản chúng ta cần định dạng danh sách các gói từ nhật ký apt thành thứ gì đó apt-get có thể hiểu được. Dấu ngoặc đơn, các từ ở giữa và dấu phẩy cần phải đi để đó là nơi mà perl xuất hiện để chơi. Vâng, có nhiều cách tốt hơn (hiệu quả hơn) - nhưng tôi đã thực hiện điều này, thật dễ hiểu và nó hoạt động.


+1 cho trải nghiệm và giải thích cá nhân, nhưng như tôi đã đề cập trước đó, tôi đã đặt lại USB trực tiếp của mình
Karthik T

1

Để hoàn tác cài đặt apt cuối cùng, bạn cũng có thể sử dụng một cái gì đó như thế này:

sudo apt purge $(grep "Install:" /var/log/apt/history.log | tail -n 1 | tr " " "\n" | grep ":amd64\|:i386" | tr "\n" " ")

Điều này sẽ bắt cài đặt apt cuối cùng từ lịch sử và thanh trừng tất cả các gói được cài đặt ở đây.

Bạn có thể tạo một hàm gọi là aptpurgelastinstall để luôn có sẵn nó (sẽ thêm mã vào ~ / .bashrc):

echo 'aptpurgelastinstall () { sudo apt purge $(grep "Install:" /var/log/apt/history.log | tail -n 1 | tr " " "\n" | grep ":amd64\|:i386" | tr "\n" " ") ; }' >> .bashrc

Bây giờ bạn chỉ cần gõ aptpurgelastinstall trong shell để làm lại cài đặt cuối cùng.


Phản ứng với phần chỉnh sửa được đề xuất Nhận xét: Nhận xét về cải thiện bài đăng của riêng tôi (trước khi tôi đăng ký). Bạn có thể yêu cầu hợp nhất các tài khoản của mình, xem Askubfox.com/help/merging-accounts .
Melebius

0

Nếu bạn vừa thêm một ppa và muốn hoàn nguyên, bạn cần thực hiện các bước được mô tả dưới đây. Hiểu điều này có thể thất bại, khi bạn đã cài đặt các gói khác mà bạn không muốn gỡ cài đặt. Tôi chắc chắn điều này có thể được thực hiện với một kịch bản. Cá nhân tôi nghĩ rằng đây phải là một phần của apt và nên quản trị tốt hơn các gói được cài đặt vì phụ thuộc và được cài đặt theo yêu cầu của người dùng.

1) xóa ppa khỏi /etc/apt/source.list Hãy nhớ thời gian bạn đã thêm ppa. Nếu bạn may mắn, bạn không cần phải chính xác.

2) lập danh sách những gì cần cài đặt lại, kể từ thời điểm bạn cài đặt PPA: cat /var/log/dpkg.log | grep 'nâng cấp'

3) lập danh sách những thứ cần xóa, kể từ thời điểm bạn cài đặt PPA: cat /var/log/dpkg.log | grep 'cài đặt'

4) xóa tất cả các gói từ bước 3: sudo apt-get remove {danh sách các gói từ bước 3}

5) cài đặt lại tất cả các gói từ bước 2: sudo apt-get install --reinstall {danh sách các gói từ bước 2}

6) Nếu xảy ra sự cố và bạn không thể nghĩ ra giải pháp, hãy đặt lại PPA và cài đặt lại tất cả các gói từ hai danh sách.


0

Tôi biết đó là một câu hỏi khá cũ nhưng tôi đã đến đây để tìm kiếm sự giúp đỡ và có lẽ tôi có thể giúp ai đó. Tôi đã gặp tình huống tương tự như @ Karthik-T sau khi cài đặt unity8-desktop-session-mir. Tôi biết đó là một cái lớn. Nó kéo 233 gói với anh ta.

Sử dụng autoremovetôi chỉ được gỡ bỏ 34 trong số họ. Vấn đề là trong quá trình unity8-desktop-session-mircài đặt, nó đã gỡ bỏ hai gói ( python3-aptdaemon.pkcompatevolution-data-server-online-accounts). Nó được nêu trong /var/log/apt/history.log, sau Installphần.

Để hoàn tác cài đặt Unity 8, tôi đã đưa ra các hướng dẫn sau:

  1. sudo apt-get purge unity8-desktop-session-mir
  2. sudo apt-get --purge autoremove
  3. sudo apt-get install python3-aptdaemon.pkcompat evolution-data-server-online-accounts (nó đã xóa 8 gói liên quan đến Unity 8)
  4. sudo apt-get --purge autoremove

Điều này sẽ không loại bỏ hoàn toàn mọi thứ bạn đã cài đặt trước đó, nhưng trong một số trường hợp là đủ tốt.

PS: có lẽ autoremoveở bước hai là không cần thiết, vì tôi đã ban hành lại ở bước bốn.


0

Về mặt kỹ thuật, các hoạt động "loại bỏ" hoặc "tự động" không phải là "hoàn tác" mặc dù chúng có thể được thực hiện để thực hiện công việc đủ tốt trong hầu hết các lần.

Theo mặc định, apt-get sẽ để lại các gói phía sau, trừ khi bạn chỉ định -o APT::Suggests-Important=0 -o APT::Recommends-Important=0

Đáng tin cậy hơn là hãy xem apt history.logvà gỡ cài đặt tất cả các gói đã cài đặt. Tôi đã tạo một tập lệnh dựa trên nút nhỏ để dễ dàng xử lý:

https://github.com/rolfen/apt-history

Ngoài ra, đây là một cách tiếp cận thủ công hơn để thay đổi "quay ngược":

https://unix.stackexchange.com/a/236711

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.