예를 들어, 다음과 같은 파일이 있습니다.
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
PROJECT
var를 다음과 같이 설정할 수 있습니다 .~/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
.