globstar: `**string*`이 `**/*string*` 하위 디렉터리에 들어가지 않습니다.

globstar: `**string*`이 `**/*string*` 하위 디렉터리에 들어가지 않습니다.

주어진 문자열과 일치하는 (하위)디렉터리의 파일 집합은 다음과 같습니다.

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/

관련 정보