Bỏ qua các gói hiện chưa được cài đặt khi sử dụng apt apt-get remove


15

Tôi có một kịch bản trong đó tôi muốn xóa một tập hợp các gói có thể hoặc không thể được cài đặt và tôi muốn apt-get loại bỏ những gói đó và âm thầm bỏ qua những gói không có. Cái gì đó như:

apt-get remove foo bar baz

trong đó, nếu foo và thanh được cài đặt nhưng baz thì không, sẽ loại bỏ foo và bar mà không phàn nàn về baz. Có cách nào để làm việc này không?

Những thứ tôi đã thử không hoạt động, với cup-dbg là gói vật phẩm thực tế được cài đặt của tôi sẽ bị xóa:

jcp@a-boyd:~$ sudo apt-get remove -y cups-dbg bogus-package
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package bogus-package

jcp@a-boyd:~$ sudo apt-get remove --ignore-missing cups-dbg bogus-package
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package bogus-package

jcp@a-boyd:~$ sudo apt-get remove --fix-broken cups-dbg bogus-package
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package bogus-package

Tôi biết tôi có thể làm điều này với một kịch bản shell và một số dpkg --listphép thuật, nhưng tôi muốn tránh mọi sự phức tạp không thực sự cần thiết.


Câu trả lời này đã làm việc cho tôi cuối cùng. Sửa chữa câm cho một vấn đề ngu ngốc. Lưu ý rằng thực sự có một khiếm khuyết trên Launchpad về điều này vì vậy hãy thoải mái đóng góp.
Jeff

Câu trả lời:


8

Là rơi trở lại công cụ cấp thấp hơn như dpkg là một tùy chọn?

dpkg --remove foo bar libperl-dev
dpkg: warning: ignoring request to remove foo which isn't installed
dpkg: warning: ignoring request to remove bar which isn't installed
(Reading database ... 169132 files and directories currently installed.)
Removing libperl-dev ...

Để loại bỏ các gói cấu hình, sử dụng thanh lọc như dưới đây

dpkg --purge foo bar libperl-dev

1
Tôi nên đề cập rằng các gói cần xóa có thể có các phụ thuộc ngược và tôi cũng muốn các gói đó bị xóa. Do đó, Apt-get tốt hơn nhiều so với dpkg, nhưng tôi sẽ chấp nhận câu trả lời của bạn vì dường như thực sự không có cách nào tốt hơn để làm điều này.
javawizard

7

Tôi sử dụng apt-get remove --purge(aka apt-get purge) cho sự phụ thuộc sau với một danh sách các gói. Để xử lý các gói không tồn tại, tôi lọc ra các gói không được cài đặt với tập lệnh sau.

pkgToRemoveListFull="cups-dbg bogus-package"
pkgToRemoveList=""
for pkgToRemove in $(echo $pkgToRemoveListFull); do
  $(dpkg --status $pkgToRemove &> /dev/null)
  if [[ $? -eq 0 ]]; then
    pkgToRemoveList="$pkgToRemoveList $pkgToRemove"
  fi
done
apt-get --yes --purge remove $pkgToRemoveList

3

Đối với Debian 9, có thể chỉ sử dụng aptitudethay vì apt-get:

sudo aptitude remove -y cups-dbg bogus-package

Aptitude in cảnh báo, nhưng vẫn tiếp tục xóa các gói của bạn:

Couldn't find any package whose name or description matched "bogus-package"
...
Removing cups-dbg ...
...

Nếu bạn muốn thanh lọc (xóa các tệp cấu hình gói) thay vì xóa (giữ các tệp cấu hình), lưu ý rằng aptitudechỉ xóa các gói được cung cấp trực tiếp, trong khi các phụ thuộc không sử dụng chỉ bị xóa. Tuy nhiên, bạn có thể xóa tất cả các gói đã xóa trong bước thứ hai:

apt-get -y purge $(dpkg -l | grep ^rc | awk '{print $2}')

đồng ý. đôi khi, bogus-packagechỉ có tên sai. vì vậy, trong trường hợp chúng tôi có 500 gói, tốt hơn hết là phân tích các gói không có thật và thực hiện một số thủ thuật (ví dụ: số còn thiếu tên, v.v. vì vậy, bạn có thể vui lòng đưa ra một số gợi ý về cách thực hiện việc này không ..
nyxee

@nyxee Tôi đề nghị hỏi đây là một câu hỏi mới, chỉ ra chính xác những gì bạn muốn đạt được.
vog

1
Đây sẽ là một cách giải quyết tốt, ngoại trừ 1) aptitude không còn được cài đặt theo mặc định trên Ubuntu 18.04 và 2) aptitude có một cách khá khác nhau (người ta có thể nói kỳ lạ) để xử lý các ký tự đại diện.
Jeff

Điều này không hiệu quả với tôi trên Debian 10. Tôi hiểu,Couldn't find any package whose name or description matched 'QUX' Unable to apply some actions, aborting
pdoherty926

@ pdoherty926 Cảm ơn bạn đã gợi ý. Tôi xác minh điều này và điều chỉnh câu trả lời của tôi cho phù hợp.
vog

0

Một 2-liner nhỏ khác nếu bất cứ ai cần sử dụng apt:

purge_packages () {
  matchedPackages="$(echo "$(apt list --installed $* 2>/dev/null)" | grep -v '^Listing\.\.\.' | sed -s 's|[/ ].*||' | tr '\n' ' ' | sed 's/ *$//;s/^ *//')"
  [[ -n "$matchedPackages" ]] && apt purge -yq $matchedPackages
}

Giải thích:

apt list --installed $*         # Lists packages matched from function args, the --installed flag limits results to installed packages

2>/dev/null                     # Disregard the warning about using this command in a script

grep -v '^Listing\.\.\.'        # Remove the first line of output that says "Listing..." or "Listing... Done"

sed -s 's|[/ ].*||'             # Remove the rest of the line after the package name (I'm checking for / or space though it looks like just the slash is needed but package names will never have a space)

tr '\n' ' '                     # Put it all on one line separated by spaces

sed 's/ *$//;s/^ *//'           # Remove trailing and leading spaces from the line so it will be blank during the test next line if nothing was matched

[[ -n "$matchedPackages" ]]     # Check if any packages were matched

apt purge -yq $matchedPackages  # Purge them!

Chào mừng bạn đến với SuperUser! Bạn có thể thêm mô tả vào câu trả lời của bạn về kịch bản của bạn không, và nó diễn ra như thế nào?
El8dN8

@ El8dN8 Đã thêm khám phá
Meir
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.