“apt-get remove”를 사용할 때 현재 설치되지 않은 패키지는 무시하십시오. 이것을 할 수있는 방법이 있습니까? scapegoat 실제로 설치된

설치되었거나 설치되지 않은 패키지 세트를 제거하려는 시나리오가 있으며, 그렇지 않은 패키지를 제거하고 자동으로 무시하는 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마법 으로이 작업을 수행 할 수 있다는 것을 알고 있지만 절대적으로 필요하지 않은 복잡성을 피하고 싶습니다.



답변

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

답변

패키지 목록과 함께 다음 종속성에 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

답변

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}')

답변

누구나 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!