Là lệnh này để loại bỏ các hạt nhân cũ an toàn để sử dụng?


21

Trong khi duyệt internet các bài viết về Ubuntu, tôi đã bắt gặp lệnh này:

sudo dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | xargs sudo apt-get -y purge

Tác giả nói rằng đây là một dòng lệnh sẽ xóa tất cả các phiên bản Linux trước đó, chỉ còn lại phiên bản hiện tại !

Tôi thực sự đang tìm kiếm một lệnh như vậy, nhưng tôi không chắc chắn về mức độ an toàn của nó. Tôi muốn biết:

  • Liệu nó có an toàn để thực hiện lệnh này?
  • Lệnh này hoạt động như thế nào? tức là giải thích các phần nhỏ của một lệnh lớn như vậy
  • Nếu lệnh này phục vụ một số mục đích khác nhau, thì đâu sẽ là lệnh chính xác để đạt được những gì tác giả tuyên bố nó phải làm gì?

Tôi trở nên rất bối rối và thất vọng khi tôi cố gắng tự mình suy luận ra. Làm thế nào để công việc lệnh này bởi nó chứa đựng rất nhiều /, |, \, *, và^ nhân vật mà rất khó để Google cho.

Tôi đang tìm kiếm một bản dịch từng bước và giải thích cho lệnh này mà tôi không thể tìm thấy trên internet!


1
Đây dường như không phải là lệnh bạn trích dẫn, nhưng tôi đã sử dụng lệnh trong tuxtweaks.com/2010/10/NH để loại bỏ các hạt nhân cũ mà không gặp vấn đề gì. Trang này cũng giải thích những gì lệnh làm.
dùng68186

4
@UriHerrera apt-get autoremovekhông đề xuất bất kỳ loại bỏ hạt cũ nào cho tôi. Nếu tôi không xóa chúng, chúng sẽ chồng chất cho đến khi tôi /boothết dung lượng và cập nhật thất bại. Bạn có một tài liệu tham khảo cho nó về nó nên làm điều này?
gertvdijk

1
Nó làm cho tôi, bất cứ khi nào có bản cập nhật mới cho kernel, nó nói sau đó các gói sau, v.v., không còn cần thiết nữa và nó liệt kê kernel trước đó mà tôi có.
Uri Herrera

Câu trả lời của tôi đã bị xóa bởi một người điều hành, vì vậy tôi nhận xét ở đây: Xem bài viết này để được giải thích về kịch bản. Tôi không thấy lý do tại sao một phần của kịch bản s/^[^ ]* [^ ]* \([^ ]*\).*/\1/thay vì đơn giản s/^[^ ]* \([^ ]*\).*/\1/. Kịch bản không mạnh mẽ hay thanh lịch. Ví dụ tại sao kiểm tra kernel hiện tại trước khi trích xuất tên gói từ đầu ra? Đối với một giải pháp thay thế, sudo apt-get autoremove --purgethanh lọc hầu hết các hạt nhân cũ trong một số bản phát hành mới nhất của Ubuntu như Xubfox 15.10.
jarno

Câu trả lời:


27

Tôi muốn nói: không sử dụng nó ở dạng hiện tại

  1. Nó thay đổi mà không cần hỏi bạn. Phần này apt-get -y purgecho phép một lớp lót bắt đầu thực hiện các gói thanh trừng mà không cần xác nhận của bạn. Nếu có bất kỳ lỗi nào trong tập lệnh tồn tại, thì bạn có thể bị vặn .

  2. Không có nguồn, không có tác giả đưa ra. Nguồn gốc của nó làm cho một sự khác biệt ở đây. Trong trường hợp nó đến từ gói hệ thống được kiểm tra kỹ lưỡng, chúng tôi có thể theo dõi quá trình kiểm tra được thực hiện trên nó. Từ một nguồn ngẫu nhiên, chúng tôi không thể tin tưởng được.

  3. dpkg -lchạy tốt mà không có sudo. Tôi không thấy lý do tại sao tác giả ban đầu nghĩ rằng điều này là cần thiết.

Sử dụng suy nghĩ thông thường

Loại bỏ các phần có hại và để lại bất cứ thứ gì chạy như root.

Ví dụ: cắt nó xuống:

dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'

chỉ xuất ra công cụ và chạy với quyền người dùng thông thường . Khi bạn đồng ý với các hạt nhân này sẽ bị xóa, bạn có thể tự nối thêm | xargs sudo apt-get purge . Nó không có-y tùy chọn, cố ý, vì vậy bạn sẽ được yêu cầu xác nhận về những thay đổi sắp được thực hiện cho hệ thống của bạn.

Giải trình

  • dpkg -lXuất ra danh sách tất cả các gói. Trong trường hợp này, nó sẽ chỉ liệt kê các gói bắt đầu bằng linux-tên.
  • |(một đường ống) dẫn đầu ra của lệnh ở bên trái (chúng ta gọi đó stdout) vào đầu vào của lệnh ở bên phải (chúng ta gọi đó là stdin).
  • sedlà một công cụ để thao tác các chuỗi bằng các biểu thức thông thường . Trong trường hợp này, nó thao tác đầu ra của lệnh ở bên trái của đường ống và các bộ lọc cho các gói đã cài đặt (dựa vào iinhư được đưa ra bởi dpkg). Nó thậm chí còn được lồng trong trường hợp này. Sẽ là quá khó để giải thích toàn bộ việc sử dụng sedở đây, vì việc sử dụng nó rất phức tạp với các biểu thức chính quy phức tạp. (đây \(.*\)-\([^0-9]\+\)"là một ví dụ về biểu thức chính quy.
  • Biểu thức chính quy được sử dụng rất rộng rãi để tìm kết quả khớp dựa trên biểu thức mà chúng đại diện. \1là tham chiếu thay thế để thực hiện một loại tìm kiếm và thay thế phổ quát (tham chiếu đến 'lần truy cập' đầu tiên với 1). Các biểu thức chính quy không thể làm hại bất kỳ. Tuy nhiên, nếu họ thao tác đầu vào sai cách, họ có thể yêu cầu bạn loại bỏ các gói sai hoặc thậm chí thực hiện tiêm vỏ. Trong trường hợp này, nó giống như một cách để tìm tên của gói kernel dựa trên phiên bản được cung cấp bởi uname -r.
  • uname -r xuất ra phiên bản hiện tại của kernel đang chạy.
  • xargsnối các dòng của đầu vào bên trái của ống làm đối số cho lệnh. Trong trường hợp này, các phiên bản kernel trên mỗi dòng được chuyển đổi thành một danh sách được phân tách bằng không gian ngang và được gắn vào sudo apt-getlệnh.
  • sudo apt-get -y purge [packagename] thanh trừng (loại bỏ tất cả mọi thứ) của các gói được đưa ra (như là đối số).

Lựa chọn thay thế

Khá nhiều câu hỏi có lẽ đã được hỏi về điều này. Những cái có liên quan tôi tìm thấy cho đến nay:


1
cái gì sẽ là sự phá vỡ của nút trông đáng sợ của lệnh này, cái gì đó giống như thế này /(.*)-([ ^ n0 ] * [^] * ([^] *). * / \ 1 /; /
Bhavesh Diwan

Lệnh nói trên trong câu trả lời này có rõ ràng nhân cũ không? hoặc vẫn apt-get autoremove là tốt hơn ??
Bhavesh Diwan

4
@ Z9iT Đó là những biểu thức chính quy. Chúng được sử dụng để tìm các kết quả khớp dựa trên biểu thức mà chúng đại diện và \1là điều khiển thay thế để thực hiện một loại tìm kiếm và thay thế phổ quát. Để loại bỏ bất kỳ gói nào tôi đã thể hiện rõ ràng trong câu trả lời của mình (theo ý kiến ​​của tôi): sử dụng thông thường. Đừng để kịch bản tự động thay đổi hệ thống của bạn. Xác nhận những gì nó sẽ làm. Luôn luôn.
gertvdijk

Tính năng thay thế mà bạn không thanh lọc các gói tiêu đề linux tương ứng.
jarno

Sau đó, chỉ cần thực hiện một autoremove apt, sẽ phát hiện những tiêu đề đó không còn cần thiết nữa.
ben-Nabiy Derush

7

Bạn đã yêu cầu một lời giải thích từng bước để ở đây đi:

sudo dpkg -l 'linux-*'

Liệt kê các gói bắt đầu bằng linux-tên gói

| sed

và đưa danh sách vào sed

"s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'

sẽ sử dụng một biểu thức chính quy rất phức tạp để chỉnh sửa danh sách

| xargs

cái nào sẽ dẫn danh sách mới vào xargs, cái này sẽ gửi nó làm đối số

sudo apt-get -y purge

sẽ thanh lọc những gói đó mà không cho bạn cơ hội đổi ý.

Hoặc có lẽ chính xác hơn để nói rằng nó sẽ gửi danh sách đó vào lệnh thanh trừng và để nó ở đó. Có hay không bất cứ thứ gì được thanh trừng - và quan trọng - chính xác là những gì được thanh trừng phụ thuộc vào thông số của các lệnh trước đó.

Nó có an toàn không? Trong trường hợp này, tất cả phụ thuộc vào mức độ tác giả của bài đăng mà bạn tìm thấy nó hiểu các biểu thức và sedcú pháp thông thường . Và có toàn bộ sách về cả hai chủ đề đó.


6

Tôi bắt đầu bằng cách mổ xẻ các lệnh, đọc từng mantrang.

  • dpkg -l: liệt kê pacakges, vì vậy dpkg -l linux-*sẽ liệt kê tất cả các gói bắt đầu bằng linux-(thường là hạt nhân).

  • sed: Đầu ra của dpkg -l linux-*được dẫn đến sedvới một số biểu thức chính quy sedgiải mã.

  • uname -r unamein thông tin hệ thống

uname - thông tin hệ thống in

Các -rxử lý đặc biệt in phát hành hạt nhân:

-r, --kernel-release in bản phát hành kernel

Đầu ra của uname -rsau đó được dẫn đến sedvới các biểu thức chính quy hơn, đầu ra của nó được chuyển đếnxargs

Vì vậy, xargschuyển sedđầu ra thành tên gói và chuyển chúng vào sudo apt-get purge -yđó tự động trả lời 'có' cho tất cả các lời nhắc:

-y, --yes, --assume-yes Tự động có để nhắc nhở; giả sử "có" là câu trả lời cho tất cả các lời nhắc và chạy không tương tác. Nếu một tình huống không mong muốn, chẳng hạn như thay đổi gói bị giữ, cố gắng cài đặt gói không được xác thực hoặc loại bỏ gói thiết yếu xảy ra thì apt-get sẽ hủy bỏ. Mục cấu hình: APT :: Get :: Giả sử-Có.

Nhìn chung, có vẻ như lệnh này sẽ làm những gì bạn muốn, mặc dù để biết chắc chắn chúng ta phải dịch sedcác biểu thức chính quy.

Tôi vừa chạy:

dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'  

đây là một ảnh chụp màn hình:

nhập mô tả hình ảnh ở đây

Tất cả các phiên bản kernel cũ iirc.


những gì tập luyện để dịch biểu hiện của sed này?
Bhavesh Diwan

2
Tôi đang cố gắng để hiểu nó ngay bây giờ, có thể chúng ta sẽ mất một lúc;)
Seth


@ Z9iT Tôi quá lười biếng để sao chép lời giải thích của tập lệnh từ bài viết được liên kết vào câu trả lời, vì vậy tôi đoán đó là lý do Seth đã xóa câu trả lời của tôi. Nhưng tôi nghĩ rằng bài viết được liên kết là những gì bạn đang tìm kiếm từ Internet. Tôi cũng nói với bạn một cách an toàn hơn để loại bỏ các hạt nhân cũ, mặc dù nó chỉ giữ 2-3 hạt nhân trong trường hợp và có thể không hoạt động trong tất cả các bản phát hành Ubuntu hiện tại.
jarno

@jarno Tôi đã xóa nó vì Z9iT đang hỏi về một lệnh cụ thể , không phải là cách an toàn để loại bỏ các hạt nhân cũ. Điều đó có thể vẫn có liên quan, nhưng trong một bình luận, không phải là một câu trả lời :) (như bạn đã làm)
Seth
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.