지정된 파일을 제외한 모든 파일을 찾는 방법 CentOS-Vault.repo 그러나 실제로 난 그냥

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\)]

그러나 오류 정보가 표시됩니다. 어떻게해야합니까?



답변

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

ls CentOS-[BDV]*

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

또는 부정 과 동일 :

ls CentOS-[^M]*

MGNU 구현 ls(일반적으로 CentOS에 있음)으로 문자 를 포함하는 모든 파일 이름을 무시 하려면 -I( --ignore) 옵션을 사용하십시오 .

ls -I '*M*'

-I, –ignore = PATTERN
PATTERN과 일치하는 암시 적 항목을 나열하지 않습니다.

Media단어가있는 항목을 무시하려면

ls -I '*Media*'

이러한 패턴은에 그대로 전달 ls해야하므로 따옴표로 묶어야합니다 (그렇지 않으면 셸에서 패턴을 확장 할 globs로 처리합니다).


답변

몇몇 쉘에는 부정적 연산자가 있습니다.

  • 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 -- *
    

답변

하나의 옵션은 플래그 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 바이트 로 강제 로 분리 해야 합니다. 바라건대, grepflag와 함께 이런 종류의 구분 기호를 지원합니다 -z. 다음과 같이 일반적인 분리 (예 : null 바이트-> 새 줄)로 되돌릴 수 있습니다tr '\0' '\n'


답변

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

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

여기서 “f”는 일반 파일 만 검색 함을 의미 합니다 ( 일반 파일에 대한 심볼릭 링크는 제외하고 GNU find에서는 -xtype f대신 포함하여 사용). 디렉토리를 검색하려면 대신 “d”를 전달하십시오.

( -maxdepth처음에 GNU 확장은 이제 매우 일반적입니다. find지원하지 않으면 -maxdepth 1standard로 바꿀 수 있습니다 ! -name . -prune).

더 멋진 기능 은 find man 페이지 를 참조하십시오 .