`ls` 일치 패턴에서 하나의 디렉토리 제외


13

내부에 파일 ls이있는 디렉토리를 시도하고 .png있습니다 (재귀가 필요하지는 않지만 더 유용 할 것입니다). 하나의 디렉토리 즉,

ls */*.png

잘 작동합니다.

ls (^one)*/*.png

stdout을 리턴하지 않습니다. 어떻게하면 되나요?

나는 장님이고 그것을에 배관하기 espeak때문에 지금은 표준 음 만들을 수 있습니다.


어떤 쉘을 사용하고 있습니까? 당신의 패턴은 zsh 패턴처럼 보이지만, 배제하지 않을 것이기 때문에 one(올바른 패턴은 ^one/*.png) 유용한 것은 아니지만 모든 것을 인쇄합니다.
Gilles 'SO- 악마 그만'

답변:


16

옵션 1- 그냥 사용 ls:
확장 bash globbing을 켜면 ( shopt -s extglob) 다음을 수행 할 수 있습니다.

ls !(one*)/*.png


옵션 2- 결합 lsgrep:

당신 ls과 결합 할 수 있습니다grep -v

  • 예 : ls */*.png | grep -v "one/"


옵션 3- (최고의 IMO)이지만 다음을 사용 find하지 않습니다 ls.

다음을 사용하여 모든 하위 디렉토리의 재귀 검색 find

find . -type f -name "*.png" -not -path "*/one/*"


위의 모든 단일 라이너는 .png경로 일치를 필터링하는 동안 파일이있는 디렉토리를 나열합니다 one/. 옵션 3 만이 작업을 재귀 적으로 수행합니다.


하지 않습니다 find명령이 필요 말을 -path "*/one/*"-path "./one/*"?
G-Man, 'Reinstate Monica'라고

@ G-Man 당신은 절대적으로 맞습니다. 위에서 편집했습니다.
toxefa

여전히 일치하지 ./phone/handset.png않습니까?
G-Man, 'Reinstate Monica'라고

@ G-Man .png이라는 디렉토리에서 s 를 일치시키는 데 문제가있는 것은 무엇입니까 phone? 방금 배제하려고한다고 생각 one했나요?
toxefa

1
글쎄, 당신이와 관련하여 그것을 사용하고 있기 때문에 -not, 그것은이 (가) 발생한다는 것을 의미 find라는 디렉토리에있는 파일을 제외 할 phone.
G-Man, 'Reinstate Monica'라고

6

에서 zsh을 넣어 setopt extended_glob당신에 ~/.zshrc. 그런 다음 와일드 카드 패턴 ^one 을 사용하여 라는 디렉토리를 제외 할 수 있습니다 one.

ls ^one/*.png

하위 디렉토리로 재귀를 원하면 **/재귀 globbing에 사용하십시오. one최상위 디렉토리뿐만 아니라 최상위 디렉토리에서 호출 된 디렉토리를 제외하려면 다음을 수행하십시오.

ls ^one/**/*.png

one서브 디렉토리의 파일이 아닌 이라는 서브 디렉토리에서 파일을 제외 시키려면 다음을 수행하십시오.

ls **/^one/*.png

one임의의 레벨에서 호출 된 서브 디렉토리 에서 파일을 제외 시키려면 #부정 과 관련하여 연산자 와 반복 패턴을 사용하십시오 .

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