지정된 파일을 제외한 모든 파일을 찾는 방법

지정된 파일을 제외한 모든 파일을 찾는 방법

ls비슷한 결과를 줄 수 있다

[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# ls

CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repo

CentOS-Base.repo하지만 사실 저는 그냥 알아보고 싶었지만 CentOS-Debuginfo.repo아니 CentOS-Vault.repo었어요 CentOS-Media.repo. 그래서 이 명령을 실행합니다.

ls [^\(Media\)]

그런데 오류 메시지가 뜹니다. 어떻게 해야 하나요?

답변1

일부 쉘에는 음수 와일드카드가 있습니다.

  • zsh -o extendedglob:

    ls -d -- ^*Media*
    ls -d -- *.repo~*Media* # ~ is "except" operator
    
  • ksh, zsh -o kshglob, bash -O extglob:

    ls -d -- !(*Media*)
    
  • bash:

    GLOBIGNORE='*Media*'
    ls -d -- *
    
  • ksh:

    FIGNORE='@(*Media|.)*'
    ls -d -- *
    

답변2

가장 간단한 경우에는 다음을 사용할 수 있습니다(첫 번째 하위 단어가 static 인 경우 CentOS).

ls CentOS-[BDV]*

  • [BDV]- 두 번째 하위 단어가 지정된 문자 중 하나로 시작하는지 확인하는 문자 클래스

또는 동일부정적인:

ls CentOS-[^M]*

MGNU 구현 ls(CentOS에서 일반적으로 발견됨)을 사용하여 이 문자가 포함된 모든 파일 이름을 무시하려면 ( -I) --ignore옵션을 사용하십시오.

ls -I '*M*'

-i,--무시=무늬
쉘과 일치하는 암시적 항목을 나열하지 않음무늬

Media단어가 포함된 항목을 무시하려면 다음을 수행하십시오.

ls -I '*Media*'

이러한 패턴은 그대로 전달되어야 하므로 따옴표 ls로 묶어야 합니다(그렇지 않으면 쉘은 이를 확장할 전역 변수로 처리합니다).

답변3

가장 쉬운 방법은 찾기를 사용하는 것입니다. 하다:

find . -maxdepth 1 -type f ! -name "CentOS-Media.repo"

여기서 "f"는 검색을 의미합니다.일반 파일(단, 일반 파일에 대한 심볼릭 링크는 포함하지 않습니다. GNU의 경우 심볼릭 링크 를 포함하는 데 find사용합니다 -xtype f.) 디렉토리를 검색하려면 "d"를 전달하십시오.

( -maxdepth원래 GNU 확장이 일반적이지만 find지원하지 않는 경우 -maxdepth 1표준으로 대체 할 수 있습니다 ! -name . -prune.)

보다매뉴얼 페이지 찾기훌륭한 기능에 대해 자세히 알아보세요.

답변4

find한 가지 옵션은 로고와 함께 사용하는 것입니다 -not -name . 즉 find . -not -name CentOS-Media.repo. -maxdepth 1재귀적인 디렉터리 구조를 원하지 않으면 플래그를 추가하세요 .

또는 다음과 같이 작성할 수도 있습니다(이것은 훨씬 더 복잡하지만 -not플래그를 잊어버렸고 원래 이 답변을 게시했으므로 이 부분을 삭제하지 않겠습니다).

find . -print0 | grep --invert-match -z "CentOS-Media.repo$" | tr '\0' '\n'

find파일 이름의 줄 바꿈으로 인해 내용이 중단되지 않도록 파일 이름을 null 바이트로 구분 해야 합니다 . grep플래그가 포함된 구분 기호가 지원되기를 바랍니다 -z. 일반적인 구분(예: 널 바이트 -> 새 줄)으로 되돌리고 싶을 수도 있습니다.tr '\0' '\n'

관련 정보