이 디렉토리 구조가 있습니다.
~/tmp/globstar ɀ find dir -type f
dir/file.ext
dir/subdir1/file.ext
dir/subdir2/file.ext
globstar
Bash 에서 옵션을 활성화하면 다음 과 같이 말할 수 있습니다.
~/tmp/globstar ɀ ls -1 dir/**/*.ext
dir/subdir1/file.ext
dir/subdir2/file.ext
내 질문은 : 왜이 dir/file.ext
목록에서 제외됩니까?
Bash 매뉴얼 은 다음에 대해 말합니다 globstar
.
설정하면 파일 이름 확장 컨텍스트에 사용 된 ‘**’패턴은 모든 파일과 0 개 이상의 디렉토리 및 하위 디렉토리와 일치합니다. 패턴 뒤에 ‘/’가 오면 디렉토리와 서브 디렉토리 만 일치합니다.
이 단락에서 “ 0 ”은 dir/file.ext
포함되어야 할 인상을 보여줄 것입니다 . 희망적으로 뭔가를 놓치지 않으면
답변
나는 그것이 하위 디렉토리 수준만을 의미한다고 생각합니다. **
/
일치 하지 않고
-
모든 파일과 디렉토리
-
0 개 이상의 하위 디렉토리
그러나 완전히 사라지지는 않습니다. **/
**
적용되는 최상위 디렉토리의 파일 이 일치 하지 않음을 의미합니다 .
당신은 필요합니다 dir/*.ext dir/**/*.ext
.
답변
나열된 배포판과 함께 제공되는 이러한 Bash 버전에서 예상 한대로 작동합니다.
- 4.1.2 (1) — CentOS 6.5
- 4.1.5 (1) — 데비안 6.0.10
- 4.1.10 (4) — 사이 그윈 1.7.31
- 4.2.46 (1) — CentOS 7.1
- 4.3.11 (1) — 우분투 14.04.1
- 4.3.30 (1) — 데비안 8.1
사실 위에 나열된 버전은 모두 테스트 한 것입니다. 다시 말해 작동하지 않는 Bash 버전 4를 찾지 못했습니다. 이 옵션은 globstar
볼 배쉬 4.0에 추가 된 변경 사항을 . . 이전 버전에서는 명령 shopt -s globstar
이 오류를 반환해야합니다.
테스트
1. dir/**/*.ext
경기 dir/file.ext
:
~/tests$ ls -1 dir/**/*.ext
dir/file.ext
dir/subdir1/file.ext
dir/subdir2/file.ext
2. **/*.ext
경기 file.ext
:
~/tests$ cd dir
~/tests/dir$ ls -1 **/*.ext
file.ext
subdir1/file.ext
subdir2/file.ext
위의 테스트를 재현하기위한 환경 준비 :
mkdir -p dir/subdir{1,2}
touch dir/{,subdir{1,2}/}file.ext
shopt -s globstar
답변
글로브 스타가 꺼져있는 것 같습니다. 다음과 같이 켤 수 있습니다.
shopt -s globstar
하위 디렉토리 0 개와 일치하지 않을뿐만 아니라 2 개의 하위 디렉토리와도 일치하지 않습니다.
$ find dir -type f #the same as yours except with a directory inside one of the subdirectories
dir/file.ext
dir/subdir1/file.ext
dir/subdir1/subsubdir/file.ext
dir/subdir2/file.ext
$ shopt -u globstar #turn globstar off
$ #will only show files in subdirectories
$ #will not show files in dir or in subsubdir
$ echo dir/**/*.ext
dir/subdir1/file.ext dir/subdir2/file.ext
$ shopt -s globstar #turn globstar on
$ #will show all four files
$ echo dir/**/*.ext
dir/file.ext dir/subdir1/file.ext dir/subdir1/subsubdir/file.ext dir/subdir2/file.ext
globstar를 끄면 **는 *와 같이 동작하므로 dir/**/*.ext
결과는 다음과 같습니다.dir/*/*.ext
$ echo dir/*/*.ext
dir/subdir1/file.ext dir/subdir2/file.ext
때때로 globstar가 켜져 있다고 생각하도록 속이는
다음과 같이 현재 globstar 설정을 확인하십시오.
shopt | grep globstar