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

어제 밤에 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에 관한 것이 있습니까?



답변

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

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

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


답변

정규식 *은 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.

답변

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.


답변

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

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

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

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

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