2011-12-15 6 views
46

하나가 bash는 패턴과 일치하는 모든 파일을 나열 수있는 방법은 다음과 같습니다패턴과 일치하지 않는 파일을 나열 하시겠습니까? 여기

ls *.jar 

어떻게 패턴의 보완을 나열? 즉 * .jar과 일치하지 않는 모든 파일?

+0

이것은 정규 표현식으로 레이블링해서는 안되며, *는 쉘 - globbing 와일드 카드이며, 정규 표현식 *이 아니며 "0 개 이상의 한정어"입니다. – sweaver2112

+0

좋은 점은, 정규식을 사용하는 것이 아마 당신이 기대하는 것과 일치하는 것을 얻는 것이 더 나은 방법이라는 것을 배우기는하지만 말입니다. – paislee

답변

38
ls | grep -v '\.jar$' 

.

+2

grep의 -v 플래그는 무엇입니까? – paislee

+12

반전 일치. 'man grep '도 있습니다. –

+0

두 가지 파일 형식을 어떻게 할 수 있습니까? – Dan

2

하나 개의 솔루션은 find의 적절한 버전으로 ls -1|grep -v '\.jar$'

+0

[ls의 출력을 분석하지 마십시오.] (http://mywiki.wooledge.org/ParsingLs), 감사합니다. –

+6

@gniourf_gniourf는 'ls'를 파싱하거나 'goto'를 사용하는 것과 같은 규칙에 대해서는 종교적이지 않습니다. 때때로 이러한 솔루션이 가장 잘 작동합니다. –

+1

이것은 이러한 경우 중 하나가 아닙니다. '찾는다. -print0 | grep -z '\ .jar $''는 --ignore 또는 Bash의 확장 된 globbing을 사용하지 않으려는 경우에도 더 잘 작동합니다. 대부분의 사람들은 어떤 규칙이나 그들이해야할 일을 이해하기 위해 전체 기사를 읽지 않으려 고합니다. "가장자리의 경우에는 작동하지 않습니다. 'find -print0'과'grep -z'를 대신 사용하십시오. –

13

이 될 것입니다, 당신이 뭔가를 할 수 있지만, 조금 잔인한 :

find . -maxdepth 1 ! -name '*.jar' 

find 파일을 찾습니다. . 인수는 . (현재 디렉토리)에서 검색을 시작하도록 지정합니다. -maxdepth 1은 한 단계 깊이, 즉 현재 디렉토리 만 검색하려고한다고 말합니다. ! -name '*.jar'이 아닌 파일을 모두과 일치하고 정규 표현식 *.jar과 일치합니다.

내가 말했듯이,이 응용 프로그램에는 조금 과잉이지만, -maxdepth 1을 제거하면 재귀 적으로 모든 비 jar 파일을 검색 할 수 있습니다.

27

작은 알려진 bash는 확장 규칙 :

ls !(*.jar) 
+2

bash :! : 이벤트를 찾을 수 없습니다. 내가 무엇이 필요 하나? – paislee

+6

먼저 명령 줄에서 'shopt -s extglob'를 실행 한 다음 명령을 입력하십시오. –

58

사용 egrep을 스타일의 확장 패턴 매칭.

ls !(*.jar) 

이 기능은 bash-2.02-alpha1부터 사용할 수 있습니다. 먼저 bash는-4.1-알파로

shopt -s extglob 

기본적으로이 가능하게하는 설정 옵션이 활성화해야합니다.

+1

shopt -s extglob에 대한 언급이 있습니다. –

+2

정답입니다. 올바른 것으로 표시된 대답은 셸을 직접 사용하지 않고 보조 명령을 사용합니다. – dbn

+0

@dbw -이 답변이 더 마음에 드는데, 받아 들인 대답은 그 질문에 좋습니다. OP는 특별히 "셸 직접 사용"을 요구하지 않습니다. –

14

POSIX는 일치하지 않는 대괄호 식을 정의하므로 셸에서 파일 이름을 확장 할 수 있습니다.

ls *[!j][!a][!r] 

이것은 약간의 단점을 가지고 있지만 최소한 유닉스 쉘과 호환됩니다.

+0

POSIX 준수를 위해 +1. 별칭과 결합 된 약간의 bash/python/ruby ​​함수. "lsnot"은 쉽게 사용할 수 있습니다. – Nikkolasg

+0

3 문자보다 짧은 문자는 일치하지 않습니다. –

1

파일 확장명을 두 개 이상 제외하려면 파이프 | (예 : ls test/!(*.jar|*.bar))으로 구분하십시오. 의 그것을 시도하자

$ mkdir test 
$ touch test/1.jar test/1.bar test/1.foo 
$ ls test/!(*.jar|*.bar) 
test/1.foo 

다른 답변을 보면 먼저 shopt -s extglob해야 할 수도 있습니다.

+1

이것을'! (*. [bj] ar)'로 단축 할 수 있습니다. –

관련 문제