패턴과 일치하지만 다른 패턴과 일치하는 파일은 무시 하시겠습니까? 해 봅시다. 로 시작 a하지만 포함하지

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



답변

다만:

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


답변

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

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

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


답변

쉬운 방법은

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

UNIX 명령은

ls -1 a* | grep -v 3

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

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


답변

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

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

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

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

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


답변