bash globstar 매칭


17

이 디렉토리 구조가 있습니다.

~/tmp/globstar ɀ  find dir -type f
dir/file.ext
dir/subdir1/file.ext
dir/subdir2/file.ext

globstarBash 에서 옵션을 활성화하면 다음 과 같이 말할 수 있습니다.

~/tmp/globstar ɀ  ls -1 dir/**/*.ext
dir/subdir1/file.ext
dir/subdir2/file.ext

내 질문은 : 왜이 dir/file.ext목록에서 제외됩니까?

Bash 매뉴얼 은 다음에 대해 말합니다 globstar.

설정하면 파일 이름 확장 컨텍스트에 사용 된 '**'패턴은 모든 파일과 0 개 이상의 디렉토리 및 하위 디렉토리와 일치합니다. 패턴 뒤에 '/'가 오면 디렉토리와 서브 디렉토리 만 일치합니다.

이 단락에서 “ 0 ”은 dir/file.ext포함되어야 할 인상을 보여줄 것입니다 . 희망적으로 뭔가를 놓치지 않으면


2
이 캐릭터는 무엇입니까? ɀ?
slm

2
어떤 플랫폼에서 어떤 버전의 bash입니까? 데비안 wheezy의 bash 4.2.37 또는 Debian squeeze의 bash 4.1.5로는 이것을 재현 할 수 없습니다. @slm unicode ɀ또는 Wikipedia
Gilles 'SO-stop

1
@Gilles 프롬프트입니까?
slm

5
그렇습니다! ɀ프롬프트를 구별하기 위해 여기에 사용 된 문자 일뿐입니다. 일부 사용자는 문자 대신 £또는 :)를 선호합니다 . 원래 특수 아프리카 표기법을 위해 만들어진 'z'문자 :-)$ɀ
Slyx

1
OS X 10.9와 함께 제공되는 "GNU bash 버전 3.2.53 (1)-릴리스 (x86_64-apple-darwin13)"에는이 동작이 있습니다.
natevw

답변:


8

나는 그것이 하위 디렉토리 수준만을 의미한다고 생각합니다. **/일치 하지 않고

  1. 모든 파일과 디렉토리

  2. 0 개 이상의 하위 디렉토리

그러나 완전히 사라지지는 않습니다. **/**적용되는 최상위 디렉토리의 파일 이 일치 하지 않음을 의미합니다 .

당신은 필요합니다 dir/*.ext dir/**/*.ext.


그래, 그게 내 대체 야, 예쁘지 않아. ;-)
Vlad GURDIGA

9

나열된 배포판과 함께 제공되는 이러한 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

1
이것이 정답입니다. OP 설정을 잊어 버렸습니다 shopt -s globstar.
CS Pei

4

글로브 스타가 꺼져있는 것 같습니다. 다음과 같이 켤 수 있습니다.

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

1
에서와 같이 쉘 옵션 설정을 직접 확인할 수 있습니다 shopt globstar.
Benjamin W.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.