apt(또는 다른 도구)를 사용하여 설치하거나 제거할 다양한 패키지(특히 커널 관련 패키지)를 선택하는 쉬운 방법이 있습니까?
현재 저는 오래된 커널을 제거하려고 합니다 apt remove linux-\*-4.4.0-{40..80}-\*
.
이렇게 하면 제거하려는 패키지가 올바르게 선택되지만 아래 양식의 오류로 인해 프로세스가 즉시 중단됩니다 E: Couldn't find any package by glob 'linux-*-4.4.0-65-*'
.
실제로 이 정규식에 해당하는 패키지는 없지만 이로 인해 경고 대신 오류가 발생한다는 사실에 상당히 놀랐습니다. 결국, 빈 패키지 세트를 제거하는 것은 간단합니다!
답변1
이 작업은 다음을 사용하여 수행할 수 있습니다.명령 대체. 예를 들어:
apt-get remove $(dpkg -l 'linux-*' | awk '/-4.4.0-([4-7][0-9]|80)-/ { print $2}')
또는 dlocate
이미 설치되어 있는 경우:
apt-get remove $(dlocate -k | grep -E -- '-4.4.0-([4-7][0-9]|80)-')
관련된 솔루션과 달리 xargs
명령 대체는 stdin 파일 설명자를 변경하지 않으므로 apt-get
apt-get은 정상적으로 입력을 받을 수 있습니다(예: debconf 질문에 대한 답변). xargs
표준 입력에서 자체 입력을 얻으므로 대화형 프로그램, 즉 표준 입력의 입력이 필요한 프로그램과 함께 사용하면 안 됩니다.
사용하려면 apt-get
먼저 xargs
문제가 발생하지 않는지 확인해야 합니다. 예를 들면 다음과 같습니다.
export DEBIAN_FRONTEND=noninteractive
dlocate -k | grep -- -4.4.0- | xargs apt-get remove -y
참고 dlocate
: 이 -k
옵션은 설치된 모든 커널 및 dkms 관련 패키지를 한 줄에 하나씩 나열합니다( -K
동일한 작업을 수행하지만 자세한 dpkg -L
형식으로 표시됨). 이 사용법을 가능하게 -k
하는 옵션을 추가했지만 dlocate
지금까지는 그 뒤에 선택적 정규 표현식 매개변수가 있어야 한다는 생각이 전혀 들지 않았습니다. -k
완전히 명백함에도 불구하고 저는 항상 grep
.
다음 버전 dlocate
(예: 1.08 이상)에서는 dlocate -k '-4.4.0-'
출력 파이핑 없이 이를 지원할 것입니다 grep
.
답변2
비슷한 것이 효과가 있을 것 같아요 apt list linux-\*-4.4.0-{40..80}-\*|awk -F '/' '{print $1}' |xargs apt remove
.
답변3
설치된 패키지 목록 가져오기( linux-image
):
dpkg --list | grep linux-image | awk '{print $2}' > file
정렬/편집 하고 삭제하려는 항목 file
만 유지한 후 다음을 실행하세요.linux-image
file=$(cat file)
echo "$file"
apt remove $file