glob *.{a,b,}test와 함께 중괄호 확장을 사용할 때 zsh에서 "일치 없음"을 무시합니다.

glob *.{a,b,}test와 함께 중괄호 확장을 사용할 때 zsh에서 "일치 없음"을 무시합니다.

foldername또는 test이라는 atest폴더의 모든 파일을 나열하고 싶습니다 btest.

나의 첫 번째 반응은 뛰는 것이었습니다ls ./foldername/*.{a,b,}test

확장 프로그램에 콘텐츠가 없으면 정상적으로 작동합니다 atest. 이 경우 오류가 발생합니다 zsh: no matches found: ./foldername/*.atest.

이 오류를 무시하고 존재하는 파일을 인쇄할 수 있는 방법이 있습니까?

zsh와 Bash 모두에서 작동하려면 필요합니다.

답변1

존재하다

ls -d ./foldername/*.{a,b,}test

{a,b,...}전역 연산자가 아닌 이것은 중괄호 확장이며 먼저 다음으로 확장됩니다.

ls -d ./foldername/*.atest ./foldername/*.btest ./foldername/*.test

각 glob은 개별적으로 확장되며 일치하지 않는 glob이 있으면 예상대로 명령이 취소됩니다 zsh(또는 fish유사한 동작에 대한 옵션을 가져와야 bash합니다 ).failglob

여기서는 이러한 모든 파일과 일치하는 단일 glob을 사용하고 해당 glob이 어떤 파일과도 일치하지 않는 경우에만 명령을 취소하려고 합니다.

ls -d ./foldername/*.(a|b|)test

nullglob단일 glob 일치가 없는 것처럼 사용하고 싶지 않으며 ls인수 없이 실행되므로 현재 디렉터리가 나열됩니다. cshnullglob일치하지 않는 glob을 제거하지만 모든 glob이 일치하지 않으면 여전히 명령을 취소하므로 이와 관련하여 더 좋습니다.

당신은 그것을 사용하고 싶지 않을 것입니다. 왜냐하면 그것은 당신에게 부끄러운 nonomatch기물 파손 행위를 초래할 것이기 때문입니다 .bash

및 in 모두에서 작동하는 glob 대안의 경우 zshksh glob( in 및 in ) bash을 사용할 수 있습니다 .set -o kshglobzshshopt -s extglobbash

그런 다음 다음을 수행합니다.

ls -d ./foldername/*.@(a|b|)test

또는:

ls -d ./foldername/*.?([ab])test

불일치 시 glob이 그대로 전달되는 것을 방지하려면 이 failglob옵션을 추가하세요.bashls

바라보다nullglob이 기본값이 아닌 이유는 무엇입니까?더 많은 정보를 알고 싶습니다.

답변2

다음을 수행하는 것이 좋습니다 find.

find ./foldername -maxdepth 1 -name '*.atest' -o -name '*.btest' -o -name '*.test'

답변3

나는 이 문제에 직면했고 먼저 ls 자체를 해킹하여 해결했습니다. 이 작업을 마친 후 필요한 것은 간단한 C 프로그램뿐이라는 것을 깨달았습니다.

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int main(int argc, char* argv[]) {
  struct stat statbuf;
  int i;
  for( i=1; i<argc; i++ ) {
    if( stat(argv[i],&statbuf) == 0 ) {
      printf("%s\n",argv[i]);
    }
  }
}

이 모든 작업과 필요한 작업은 명령줄 인수를 실행하고 유효한 파일(예: stat()이 성공한 파일)에 해당하는 문자열을 다시 에코하는 것입니다.

물론 동일한 간단한 Python, Perl 또는 stat를 실행하는 셸 함수를 사용하여 이를 시뮬레이션할 수 있지만 C로 작성하면 훨씬 더 빠르게 실행됩니다.

ls 해킹에 관해서는 내 개인 위키에서 실행했습니다.http://linux.chalisque.net/LsIgnoreMissing

답변4

@DopeGhoti의 의견이 저에게 효과적이었습니다.

즉, 다음과 같이 연산자를 /dev/null사용 하도록 오류를 리디렉션합니다.2>

ls ./foldername/*.{a,b,}test 2> /dev/null

관련 정보