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]*
M
GNU 구현 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'