bash globstar 매칭 활성화하면 다음

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

~/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포함되어야 할 인상을 보여줄 것입니다 . 희망적으로 뭔가를 놓치지 않으면



답변

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

  1. 모든 파일과 디렉토리

  2. 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