패턴과 일치하지만 다른 패턴과 일치하는 파일은 무시 하시겠습니까?


12

파일 a1, a2, a3, b1, b2, b3이있는 디렉토리가 있다고 가정 해 봅시다. 로 시작 a하지만 포함하지 않는 파일 만 일치시키고 싶습니다 3. 나는 그것을 시도하고 ls -I "*3" *a*싶지만 a1 a2 a3, 나는 그것이 일치하지 않기를 원하지만 반환합니다 a3. 이 가능 ls합니까?


흥미로운 다양한 대답이 여기 있지만 ls -I '* 3'a *가 실패한 이유에 대한 설명은 교묘하게 될 것입니다. 그리고 / 또는 왜 쉘의 globbed 목록이 ls로 ignore 스위치에 의해 필터링되지 않는가?
Theophrastus

: 남자 페이지는 -I 옵션에 대해 말한다 do not list implied entries matching shell PATTERN, 그러나 그것은 무엇을 의미하는지 설명하지 않습니다, 암시 ,하지만 난 그것을 파일에만 적용 같은데요 ls글로브 확장에 의해 얻을 수 - 그리고 ls을 확장하지 않습니다 a*, 쉘이 있다는 않습니다 .
Murray Jensen

답변:


14

다만:

shopt -s extglob  
ls a!(*3*)
  • shopt -s extglob 확장 글러브를 활성화합니다.
  • a 시작과 일치 a
  • !()내부의 일치를 무효화합니다 ()...
    • *3*이는 3아무것도 앞이나 뒤에.

$ touch 1 2 3 a1 a2 a3 b1 b2 b3 aa1 aa2 aa3 a2a a3a
$ ls a!(*3*)
a1  a2  a2a  aa1  aa2

1
참고로set -s extglob
Brian

@Brian Yea, 방금 주목했습니다 ^^
chaos

8

기존 답변은 globs로 이것을 수행하는 가장 좋은 방법을 잘 설명합니다. 대부분의 경우 find스크립팅 또는 추가 처리를 수행하려는 경우 더 나은 옵션 이므로이를 포함하겠습니다 .

$ find . -maxdepth 1 -name 'a*' -not -name '*3*'
./a1
./a2

xargs쉬운 행동 을 위해 답을 제공하거나 while read더 복잡한 것들을 위해 반복문을 제공 할 수 있습니다.


4

쉬운 방법은

  • 일치하는 모든 파일을 나열 a*
  • 그런 다음 3

UNIX 명령은

ls -1 a* | grep -v 3

ls -1 한 줄에 하나의 파일을 표시합니다.

grep일반적으로 패턴과 일치하는 -v행을 찾지 만이 동작으로 반전됩니다. 즉, grep은 해당 패턴과 일치하지 않는 행을 찾습니다.


2
안녕 피터! 솔루션의 작동 방식을 관련성있게 설명하는 것이 가장 좋습니다.
dhag

2
파싱 ls은 바보 같은 아이디어가 아니다 : mywiki.wooledge.org/ParsingLs
혼돈

3

glob 연산자를zsh 사용하십시오 .~

setopt extendedglob
print -rl -- a*~*3*

으로 gnu ls당신이 사용할 수있는 --ignore옵션 :

ls -I '[^a]*' -I '*3*'

첫 번째는 시작하지 않는 모든 파일 이름을 a무시하고 두 번째는 포함 된 파일 이름을 무시합니다3

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