일치하지 않는 glob 패턴에서 빈 문자열을 자동으로 얻는 방법


24

세 개의 파일이있는 폴더가 있다고 가정합니다.

foo1
foo2
bar

1. 내가 달리면

list_of_files=$(print foo*)
echo $list_of_files

나는 얻다: foo1 foo2

2. 내가 달리면

list_of_files=$(print bar*)
echo $list_of_files

나는 얻다: bar

3. 그러나 내가 달리면

list_of_files=$(print other*)
echo $list_of_files

나는 얻는다 : zsh: no matches found: other*( $list_of_files하지만 변수 는 비어있다)


zsh가 glob 확장과 일치하지 않는 경우 불평하지 않도록 요청하는 방법이 있습니까?

내 목표는 위의 메커니즘을 사용하여 주어진 glob 패턴과 일치하는 파일 목록 을 자동으로 수집하는 것입니다.

답변:


33

glob 한정자로 null_glob패턴 에 대한 옵션을 설정하십시오 N.

list_of_files=(*(N))

스크립트 또는 함수의 모든 패턴에서이 작업을 수행하는 경우 null_glob옵션을 설정하십시오.

setopt null_glob

이 답변 에는 bash 및 ksh가 있습니다.

print대체 또는 명령 대체를 사용하지 마십시오 ! 문자열 목록 대신 공백이있는 파일 이름으로 구성된 문자열을 생성합니다. ( 단어 분할이란 무엇입니까? 쉘 프로그래밍에서 왜 중요한가요? )


15

더 나은 방법 : for a in *(.N); do ... ; done. N 옵션은 zsh가 빈 목록을 전달하도록하고 0 번 반복합니다.

조심하십시오 ls *.foo(.N); ls가 빈 인수 목록을 받으면 모든 파일이 none 대신에 나열됩니다. 이것이 내가 NULL_GLOB (또는 bash와 동등한 것)을 좋아하지 않는 이유입니다. 모든 globs를 변경 하고 ls와 같은 호출을 쉽게 중단합니다.


@arnt에서 귀하의 답변을 본 멋진, 이것은 내가 필요한 것입니다.
gtd

.(.N)? 다른 답변은 (N)그 자체로, 차이점은 무엇입니까?
Michael Dorst

문제는 파일에 관한 .것이며 글로브 만 파일과 일치하도록 제한합니다.
arnt

4

NULL_GLOB옵션을 찾고 있다고 생각합니다 .

   NULL_GLOB (-G)
          If a pattern for filename generation has no matches, delete  the
          pattern  from  the  argument list instead of reporting an error.
          Overrides NOMATCH.

-1

이 방법으로 시도하십시오 :

list_of_files=$(print other*) 2>/dev/null

오류 출력을 stderr에서 / dev / null로 리디렉션하고 표시되지 않습니다.


그것은 전혀 작동하지 않습니다.
Pablo Olmos de Aguilera C.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.