설치되었거나 설치되지 않은 패키지 세트를 제거하려는 시나리오가 있으며, 그렇지 않은 패키지를 제거하고 자동으로 무시하는 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!