apt-get은 예상보다 와일드 카드를 제거하여 제거합니다. 왜?


38

어제 밤에 CD를 구우려고했습니다. k3b에 짜증이 났고 대신 brasero를 사용하기로 선택했기 때문에 k3b를 제거했습니다.

나는 입력했다 :

sudo apt-get remove k3b

탭을 두 번 누르고 시스템에 k3b 및 k3b 데이터가 모두 있음을 알았습니다. k3b가없는 시스템에서 k3b 데이터가 필요하지 않다고 가정하고, 그것을 제거하고 싶었습니다.

sudo apt-get remove k3b*

불행히도 나는 보지 않고 확인하기 위해 Y를 누르십시오. k3b및 이상을 완전히 제거했습니다 k3b-data. 내 k3b*정규식에 맞지 않는 패키지를 제거했습니다 . 예를 들면 다음 transmission과 같습니다 network-manager.

나는 사이의 공간이하지 않은 것을 매우 확신 k3b하고 *있지만, 나는 그것이했던 모든 것을 제거 왜 다른 모른다. 내가 잘못 이해하는 apt-get에 관한 것이 있습니까?


답변:


38

원하는 명령은 다음 sudo apt-get remove '^k3b.*'과 같습니다.

  • 당신은 .*어떤 문자, 여러 번 일치 해야 합니다
  • ^문자열의 시작과 일치 해야 합니다
  • bash *가 와일드 카드로 해석되지 않도록 정규식을 인용해야합니다.

(이 답변은 qbi 및 Flimm에서 제공 한 이전 정보를 완성하고 요약합니다)


5
이것은 안전하며 사용하는 것이 좋지만을 (를) 필요로하지는 않습니다 .*. 당신은 사용할 수 있습니다 sudo apt-get remove ^k3b. 의 존재 ^충분한 인수가 정규 표현식으로 해석되도록하고, 경우 apt또는 apt-get해석 정규 표현식 같은 주장은 그것을 일치 어디서나 패키지 이름. 당신이 필요로하는 이유입니다 ^--to 앵커에게 패키지 이름의 시작에 일치. 정규식은 전체 패키지 이름과 일치 할 필요는 없으며 그 일부만 가능합니다.
Eliah Kagan

1
추가 정보는 @EliahKagan Thx! (실제로 필요한 경우 필요 ^하지 않다는 것이 합리적입니다 .*)
Boris Dalstein

30

정규식 *은 0 또는 임의로 많은 수를 나타냅니다. 따라서 apt-get포함 k3된 모든 것을 제거 b하고 기본적으로 포함 된 모든 것을 제거 하라고 지시 했습니다 k3. 시스템에서 명령을 시도하면 58 패키지를 제거하려고합니다.

sudo apt-get remove -s k3b*
Package k3b is not installed, so not removed
Package k3b-data is not installed, so not removed
Package k3b-dbg is not installed, so not removed
Package libcanberra-gtk3-0 is not installed, so not removed
Package libcanberra-gtk3-0-dbg is not installed, so not removed
Package libcanberra-gtk3-dev is not installed, so not removed
…
The following packages will be REMOVED:
  appmenu-gtk ardour audacity brasero brasero-cdrkit firefox-globalmenu
  gconf-editor gir1.2-appindicator-0.1 gnome-applets gnome-control-center
…
0 upgraded, 2 newly installed, 58 to remove and 0 not upgraded.

우와! 나는 너무나 오랫동안이 대담한 윈도우 머신 (* "그리고 그 이후의 모든 것을 의미한다")에서 일하고있다!
Steve Goykovich

14
*DOS에서 같은 bash에 대한 와일드 카드로 작업을 수행하지만, 일부 명령은 같은 apt-get정규식을 기대합니다. sudo apt-get remove -s k3b*bash 를 입력 하면 bash는 현재 디렉토리에서 시작하는 파일을 먼저 찾습니다 k3b. 발견되면 해당 인수를 해당 파일 이름으로 대체합니다. 그렇지 않으면 k3b*직접로 전달 apt-get되어 정규식으로 해석됩니다. bash가 별표를 먼저 와일드 카드로 해석하지 않게하려면 (아마 그렇지 않은 경우) 다음과 같이 작은 따옴표로 인수를 묶으십시오.sudo apt-get remove -s 'k3b*'
Flimm

3
따라서 의도 된 명령은되었을 것 sudo apt-get remove -s 'k3b.*'입니다. 이 답변을 우연히 발견하고 아는 것이 정말로 중요하다는 것을 알았습니다. IMHO 이것은 예상치 못한 결과이며, 예상치 못한 apt-get의 "예기치 않은 동작"버그로 표시 할 것입니다. 일반적으로 "글로브"의미를 지정하고 지정하지 않으면 "regexp"의미를 기대하지 않습니다. 어쨌든 고마워요 +1!
Rmano

1
그리고 저와 같은 사람들은 몰랐습니다. -s옵션은 "시뮬레이션"을 의미합니다. 그것은 말한다 apt-get작업을 수행하는 것이 아니라 단순히없이 어떻게 될지를 알려하지 않는 -s옵션을 선택합니다.
보리스 달 스타 인

적어도 꼭두각시에서는 작은 따옴표를 사용하여 글 로빙을 만들 수 없습니다. 그리고 그 입니다 예기치. 'find'프로그램에서 find / -iname 'project *'를 쓰면 'project'가있는 것이 아니라 프로젝트로 시작하는 모든 것을 찾을 수 있습니다. 꼭두각시에 대한 증거로 내 결과가 '정규식'이라고 말하는 방법에 주목하고 결과가 그것을 증명합니까?
Dennis

9

sudo apt-get remove ^k3b대신 사용하십시오 . 패키지를 설치하거나 제거 할 때 *종종 위험하고 거의 필요하지 않습니다. 당신이 *그것을 사용한다면 , 당신은 그것을 인용해야하지만 , 당신이 의도 한 것보다 훨씬 더 많은 패키지를 선택하는 경향 이 경로 결과 확장 의 영향이 아닌 방법의 결과 와 그것을 해석 하기 때문에 더 안전 하지는 않습니다 .aptapt-get

  • 심지어 의 안전한 사용은* 있습니다 종종 불필요한 .
  • 안전하지 않은 사용 은 잔인 합니다. 제거 k3b*포함하는 모든 패키지을 제거합니다 k3 어디서나 이름 (그와 같은 패키지에 따라 모든 패키지)에. 오타가 아닙니다. 포함 k3하지 않아도 충분합니다 b. 왜냐하면 b*"0 이상"을 의미 하기 때문 b입니다.

당신이 실행하는 경우 apt또는 apt-getinstall, remove또는 purge액션, 이후의 각 인수는 처음으로 1 개별 패키지의 이름으로 해석했다. 정확한 이름을 가진 패키지가 존재하면 해당 작업이 수행됩니다.

거기에 그러한 패키지 없으며, 경우 aptapt-get인수 공통의 포함 여부를 확인합니다 정규 표현식 메타 문자를 2 . , ?, +,* , |, \[, ^, 또는$ . 그렇지 않은 경우 완료된 것입니다. 패키지가 없습니다.

이 경우 않는 그 문자를 포함, 다음은 정규 표현식으로 처리하고와 일치합니다 어떤 부분 어떤 패키지 이름의. 전체 이름과 일치하지 않아도됩니다. 다른 사람들이 말했듯 *이 정규 표현식 *에서 글로브 와 같은 것을 의미하지는 않습니다 . ?그렇지 않습니다. 정규식에서 :

  • *이전 항목 이 정확히 한 번이 아닌 한 번만 포함하거나 한 번만 포함 하여 여러 번 나타날 있습니다.
  • ?이전 항목을 선택 사항으로 만듭니다. 즉 , 0 번 또는 1 번 나타날 수 있습니다.

apt-get (8) ( man apt-get)는 말합니다 :

주어진 표현식과 일치하는 패키지가없고 표현식에 '.', '?'중 하나가 포함 된 경우 또는 '*'인 경우 POSIX 정규식으로 가정되며 데이터베이스의 모든 패키지 이름에 적용됩니다. 그런 다음 일치하는 항목이 설치되거나 제거됩니다. 일치는 하위 문자열로 수행되므로 'lo. *'는 'how-lo'및 'lowest'와 일치합니다. 이것이 바람직하지 않은 경우 정규식을 '^'또는 '$'문자로 고정하거나보다 구체적인 정규식을 작성하십시오.

맨 페이지 만 언급 ., ?그리고 *있지만, 그것은 불완전 로, +, |, [, ^, 및 $도하게하기에 충분하다 apt-get또는 apt정규 표현식으로 패턴을 해석한다.

당신은 어떤 문자의 수와 일치 할 수 있지만 .*- 아니 단지 *는에 나타나는 경우 알려줄까요에만이 필요 중간 정규 표현식의. 패턴은 패키지 이름의 하위 문자열과 일치하므로 패턴의 끝 (또는 시작)에서 의미가 없습니다.

맨 페이지에 및가 언급 ^되어$ 있습니다. 이 (특히 ^)를 사용하기 위해 안전하고 효율적인 패턴을 작성하는 열쇠 install, remove또는 purge조치 aptapt-get.

  • ^전체 문자열 의 시작 부분 에 정규식을 고정 합니다. ^k3b이름이 모든 패키지 선택 시작 과를 k3b.
  • $전체 문자열 의 끝에 정규식을 고정 합니다. k3b$이름이 모든 패키지 선택 것이다 과를 k3b.

따라서이 명령을 사용하여 패키지를 안전하게 제거 할 수 있습니다.

sudo apt-get remove ^k3b

마지막으로, 언급 한 특정 경우에 두 이름을 모두 직접 전달할 수도 있습니다.

sudo apt-get remove k3b k3b-data

그런 다음이 모든 복잡성을 피하십시오! (이것에 ^익숙해지면 간단하게 고정 할 수 있습니다.) 또는 괄호 확장을 사용 하면 쉘이 위의 명령으로 확장됩니다.

sudo apt-get remove k3b{,-data}

두 가지 예외가 여기에있다 : (a)는 일부 옵션 (예 :, -f, --purge) 인정되며, (b)는 상기 나타나는 몇 가지 문장 부호 달리 할 수있는 작업을 수행하기 위해 패키지 이름으로 간주 될 인수의 수행 된 작업을 변경하는 데 사용됩니다 (예 : 패키지 대신 작업을sudo apt install ubuntu-desktop^ 설치 하고 끝에 표시 될 때 ).^

2 다른 정규식 메타 문자가 존재합니다. 예를 들어, \모든 정규식의 방언에서 지원되며 일반적으로 사용됩니다. ., ?, +, *, |, [, ^, 및 $단지 APT 개발자들이 정규 표현식으로 해석 발생하게 결정 메타 될 일이 (라는 이름의 정확한 패키지로 해결 한 후 실패했습니다).

3 이를 확인하는 가장 쉬운 방법 -s은 위에서 설명한 옵션을 사용하여 이러한 패턴으로 설치 또는 제거를 시뮬레이션하는 것입니다 . 예를 들어, running apt -s install ^virtualboxsudo apt install ^virtualbox패키지 관리자가 누구의 이름으로 시작하는지 알고있는 모든 패키지를 설치하려고 시도 함을 보여줍니다 virtualbox. 그러나이 동작은 소스 코드 를 검사 하여 확인할 수도 있습니다 . 의 CacheSetHelper::PackageFromRegEx기능을 확인하십시오 cacheset.cc.


1

그런 다음 해당 프로그램이 의존하는 k3b가있는 lib를 제거하십시오.

요컨대 당신은 알지 못할 수도 있습니다. 와일드 카드를 사용하여 사물을 제거하고 메시지가 표시 될 때 사물을 읽지 않는 것이 좋습니다 (죄송합니다).

또한 -n 정규식 검색을 사용하면 이름뿐만 아니라 모든 필드를 사용합니다.

http://ccrma.stanford.edu/planetccrma/man/man8/apt-cache.8.html

또한 qbi는 정규 표현식에 문제가 있습니다.


또 다른 것은, 당신과 같은 경우 (k3b 및 k3b 데이터) k3b를 제거하십시오. 그러면 Apt는 더 이상 필요하지 않은 것들이 설치되어 있는지, 그리고 제거하기 위해해야 ​​할 일을 알려줍니다.
coteyr

와! 나는 그것이 설명 내에서도 검색 할 것으로 기대하지 않았을 것입니다! 예, 이것은 절대 다시는하지 않을 것입니다! (그리고 다음 번에 내용을 읽을 것입니다 : P)
Steve Goykovich

링크가 끊어졌습니다. -n 사용법을 분명히 설명 하시겠습니까?
Seanny123

-n은 이름 필드에서만 검색을 의미합니다.
coteyr

시도 후, -n 옵션은 인식되지 않습니다 apt-get remove만하여 apt-get cache. 실제로 apt-get remove는 설명이 아닌 패키지 이름 만 찾습니다.
보리스 달 스타 인
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.