이 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]*
M
GNU 구현 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 바이트 로 강제 로 분리 해야 합니다. 바라건대, grep
flag와 함께 이런 종류의 구분 기호를 지원합니다 -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 1
standard로 바꿀 수 있습니다 ! -name . -prune
).
더 멋진 기능 은 find man 페이지 를 참조하십시오 .