"*"를 사용하여 모든 예외를 잡는 방법

"*"를 사용하여 모든 예외를 잡는 방법

예를 들어, 다음과 같은 파일이 있습니다.

A_1.txt A_t_1.txt A_ts_1.txt A_tsa_1.txt

디렉토리에 ~/admin/packages/.

A_1.txt에 와일드카드를 전달하기 위해 for 루프를 만들고 있습니다.

for f in ~/admin/packages/*_1.txt

분명히 이것은 이러한 파일 중 하나에 와일드카드로 사용될 수 있습니다.

t구체적으로, 앞에 , 가 없는 한 모든 파일을 glob하기 위해 "제외" 명령(있는 경우)을 사용하고 싶습니다 s.a_1.txt

편집: 경로를 변수로 저장한다는 사실을 잊어버렸습니다.

PROJECT="~/admin/packages/*_1.txt"

for f in ${PROJECT}...

답변1

extglob이를 수행하려면 다음 패턴을 사용할 수 있습니다 bash.

!(*t|*s|*a)_1.txt

extglob먼저 활성화합니다(아직 활성화하지 않은 경우).

shopt -s extglob

그러면 다음과 같이 할 수 있습니다:

for f in ~/admin/packages/!(*t|*s|*a)_1.txt; do ##Something; done

예:

$ echo *_1.txt
A_1.txt Ab_1.txt A_t_1.txt A_ts_1.txt A_tsa_1.txt

$ shopt -s extglob

$ echo !(*t|*s|*a)_1.txt
A_1.txt Ab_1.txt

짧게 해주세요(감사합니다착란):

!(*[tsa])_1.txt

답변2

PROJECTvar를 다음과 같이 설정할 수 있습니다 .~/admin/packages/*[^tsa]_1.txt

PROJECT="~/admin/packages/*[^tsa]_1.txt"

경우 수정이 가능합니다.

답변3

case아래와 같이 문을 사용하여 예외를 지웁니다.

for f in ${PROJECT}; do
    case "$f" in *[tsa]_1*) continue;; esac

    # ... actual work here ...
done

답변4

귀하의 요청에 대한 정확한 답변(bash)은 다음을 사용하는 것입니다 GLOBIGNORE.

이 명령을 실행하면:

LESS=+/'^ *GLOBIGNORE' man bash

읽다:

GLOBIGNORE
경로 이름 확장 시 무시할 파일 이름 집합을 정의하는 콜론으로 구분된 패턴 목록입니다. 경로 이름 확장 패턴과 일치하는 파일 이름이 GLOBIGNORE의 패턴 중 하나와도 일치하는 경우 일치 목록에서 제거됩니다.

따라서 GLOBIGNORE다음과 같이 설정하면 됩니다.

$  ls *
A_1.txt  A_t_1.txt  A_ts_1.txt  A_tsa_1.txt
$ GLOBIGNORE=*t_1.txt:*s_1.txt:*a_1.txt
$ ls *
A_1.txt

GLOBIGNORE그런 다음 복원을 사용하여 비어 있게 할 수 있습니다 unset GLOBIGNORE.

관련 정보