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


13

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

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



@steeldriver 귀하의 링크에 감사드립니다. 저에게 매우 유용합니다.
yode

쉘을 zsh로 전환하는 것을 고려할 수 있는데, 패턴 제거 기능이 있습니다.
Basile Starynkevitch

답변:


10

가장 간단한 경우 다음을 사용할 수 있습니다 (첫 번째 하위 단어가 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로 처리합니다).


왜 사용할 수 ls *[^M]*없습니까?
yode

ls CentOS-[^M]*작업 만 ls *[^M]*하지 ..
yode

@yode, 당신이 정확히 무엇을 무시하고 싶은가에 달려 있습니다 : M문자 발생 또는 Media단어?
RomanPerekhrest

그러나 제 경우에는 해당 파일에만 charater가 M있습니다.
yode

3
패턴은 욕심이 많다 : 첫 번째 *는 마지막 문자를 제외한 모든 문자와 일치하고, [^ M]은 마지막 문자와 일치하지 않으며, 마지막 문자는 M로 끝나지 않으며 후행 *은 빈 문자열과 일치합니다. 그래서 그들은 모두 일치합니다. 그리고 M으로 끝나는 어떤 경우에도 M과 다른 것이 있다고 가정하면 여전히 일치합니다. 예를 들어 OOM이라는 파일이 있으면 첫 번째 별은 첫 번째 O와 일치하고 [^ M]은 두 번째 O와 일치합니다 후행 시작은 M과 일치합니다.
NickD

12

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

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

6

하나의 옵션은 플래그 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'


1
또한 printf '%s\0' *재귀하지 않고 기본적으로 도트 파일을 포함하지 않는 null로 구분 된 파일 이름을 얻을 수 있습니다 (그러나 일부 쉘에는 옵션이 있음). 당신은 또한 필요하지 않습니다 -E에 대한 정규 표현식, 그러나 당신이 중 하나를 백 슬래시해야 까다 롭고로 .나에 넣어 [], 당신은 할 수에 따라 GNU 찾아 그렙.
dave_thompson_085

4

가장 쉬운 방법은 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 페이지 를 참조하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.