"apt-get remove"를 사용할 때 현재 설치되지 않은 패키지는 무시하십시오.


15

설치되었거나 설치되지 않은 패키지 세트를 제거하려는 시나리오가 있으며, 그렇지 않은 패키지를 제거하고 자동으로 무시하는 apt-get을 원합니다. 다음과 같은 것 :

apt-get remove foo bar baz

foo와 bar가 설치되었지만 baz는 설치되지 않은 경우 baz에 대해 불평하지 않고 foo와 bar를 제거합니다. 이것을 할 수있는 방법이 있습니까?

scapegoat 실제로 설치된 패키지로 cups-dbg를 사용하여 시도하지 않은 것들이 제거됩니다.

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

쉘 스크립트와 dpkg --list마법 으로이 작업을 수행 할 수 있다는 것을 알고 있지만 절대적으로 필요하지 않은 복잡성을 피하고 싶습니다.


답변 은 결국 저에게 효과적이었습니다 . 바보 문제에 대한 바보 수정. 실제로 Launchpad결함 이 있으므로 기고하십시오.
Jeff

답변:


8

dpkg 와 같은 하위 수준 도구로 다시 넘어가 는 옵션입니까?

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 ...

패키지 구성 파일을 제거하려면 다음과 같이 제거를 사용하십시오.

dpkg --purge foo bar libperl-dev

1
제거해야 할 패키지가 역 종속성을 가질 수 있으며 패키지도 제거하고 싶습니다. 따라서 Apt-get은 dpkg보다 훨씬 낫지 만 실제로이 작업을 수행하는 더 좋은 방법이없는 것 같아서 귀하의 답변을 수락하겠습니다.
javawizard

7

패키지 목록과 함께 다음 종속성에 apt-get remove --purge(aka apt-get purge)를 사용 합니다. 존재하지 않는 패키지를 처리하기 위해 다음 스크립트와 함께 설치되지 않은 패키지를 필터링합니다.

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

Debian ≤ 9의 경우 다음 aptitude대신에 사용할 수 있습니다 apt-get.

sudo aptitude remove -y cups-dbg bogus-package

적성은 경고를 인쇄하지만 그럼에도 불구하고 패키지를 계속 제거합니다.

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

제거 (구성 파일 유지)하지 않고 제거 (패키지 구성 파일 삭제)하려는 경우 aptitude직접 제공된 패키지 만 제거하고 사용하지 않는 종속성은 제거해야합니다. 그러나 두 번째 단계에서 제거 된 모든 패키지를 제거 할 수 있습니다.

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

확인. 때때로, bogus-package단지 이름이 잘못되었습니다. 따라서 500 개의 패키지가있는 경우 가짜 패키지도 분석하고 일부 트릭을 수행하는 것이 좋습니다 (예 : 부족한 이름 등의 숫자 등). ..
nyxee 2012 년

@nyxee 나는 이것을 당신이 달성하고자하는 것을 정확하게 지적하면서 새로운 질문으로 제안 할 것을 제안합니다.
vog '

1
이것은 1) aptitude가 더 이상 우분투 18.04에 기본적으로 설치되지 않고 2) aptitude는 와일드 카드를 처리하는 방법이 상당히 다릅니다 (이상한 말을 할 수 있음)를 제외하고는 좋은 해결 방법입니다.
Jeff

이것은 데비안 10. 볼에 나를 위해 작동하지 않습니다Couldn't find any package whose name or description matched 'QUX' Unable to apply some actions, aborting
pdoherty926

@ pdoherty926 힌트 주셔서 감사합니다. 나는 이것을 확인하고 그에 따라 대답을 조정했다.
vog September

0

누구나 apt를 사용해야하는 경우 2 개의 작은 라이너가 있습니다.

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
}

설명 :

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!

수퍼 유저에 오신 것을 환영합니다! 스크립트가 무엇을 어떻게하는지에 대한 답변에 더 많은 설명을 추가 하시겠습니까?
El8dN8

@ El8dN8 추가 설명
Meir
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.