주어진 문자열과 일치하는 (하위)디렉터리의 파일 집합은 다음과 같습니다.
find -name 'string' | sort
./1/2/3/4/string
./1/2/3/string
./1/2/string
./1/string
./string
globstar
다음과 같은 파일을 일치시키는 데 사용하는 이유
ls **string
string
동안 디렉터리를 실행할 수 없습니다.
ls **/string
1/2/3/4/string 1/2/3/string 1/2/string 1/string string
성공하셨나요? 페이지 설명을 제가 이해한 바에 따르면 man
(하위)디렉토리와 일치해야 합니다. 그렇지 않습니까?
이와 같은 질문은 일반적으로 중복으로 표시됩니다."ls *, ls ** 및 ls ***의 결과", 그러나 거기에 대한 답변은 그것만 다루고 ls **
디렉토리를 통해 반복됩니다. 이중 별표 뒤에 문자열이 오는 것 같습니다 globstar
.
실행 GNU bash v.4.4.19(1)
대상mint 19
~에서man bash
글로벌 스타
설정된 경우 경로 이름 확장 컨텍스트 **에 사용된 패턴은 모든 파일과 0개 이상의 디렉터리 및 하위 디렉터리와 일치합니다. 패턴 뒤에 /가 오면 디렉터리와 하위 디렉터리만 일치합니다.
답변1
이는 Ksh와 Zsh에서도 마찬가지입니다.
$ mkdir -p a/b/cdir
$ touch a/b/cfile
$ ksh -c 'set -o globstar; echo **c*'
**c*
$ zsh -c 'echo **c*'
zsh:1: no matches found: **c*
패턴 일치에서 Bash 매뉴얼은 다음과 같이 말합니다.
globstar
셸 옵션이 활성화되어*
파일 이름 확장 컨텍스트에서 사용 되면*
단일 패턴으로 사용되는 두 개의 인접한 s는 모든 파일과 0개 이상의 디렉터리 및 하위 디렉터리와 일치합니다.
'싱글 모드'는 슬래시로 구분된 섹션이므로 foo/**/bar
단일 모드에 있다는 의미로 이해될 수 있지만 **bar
그렇지 않습니다.
하지만 이것이 더 명확할 수도 있습니다.
전체 패턴 뒤에 슬래시가 있으면 패턴이 디렉터리에만 일치하게 됩니다.
$ echo **/c*/
a/b/cdir/
답변2
제한되지 않은 경우 *
이중 붕괴 효과는 다음과 같습니다 .*
/
$ ls *c
abc ac acc bc cc dc
$ ls **c
abc ac acc bc cc dc
a 이외의 선행 또는 후행 문자는 부패를 /
유발합니다 **
.
이는 경로 이름(파일 이름)이아니요/
.a 가 포함되어 있으면 포함된 이름으로 확장
될 수 없습니다 . A는 다소 유사하며 다음을 포함하는 문자열로 확장됩니다.*
/
**
/
오직/
단독이거나 다른 문자/문자열이 아닌 다음으로 분리된 경우:
$ ls -d ./** | sort
./
./1
./1/2
./1/2/3
./1/2/3/4
./1/2/3/4/string
./1/2/3/string
./1/2/string
./1/string
./abc
./ac
./acc
./bc
./cc
./dc
./string
$ ls -d ./**c | sort
./abc
./ac
./acc
./bc
./cc
./dc
$ ls -d ** | sort
1
1/2
1/2/3
1/2/3/4
1/2/3/4/string
1/2/3/string
1/2/string
1/string
abc
ac
acc
bc
cc
dc
string
$ ls -d **c | sort
abc
ac
acc
bc
cc
dc
$ ls -d **/ | sort
1/
1/2/
1/2/3/
1/2/3/4/
$ ls -d 1**/ | sort
1/