다음 디렉터리 구조가 있습니다.

~/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이 목록에서 제외 되었습니까?

배시 설명서 globstar :

설정된 경우 파일 이름 확장 컨텍스트에 사용되는 패턴 **는 모든 파일과 0 개 이상의 디렉토리 및 하위 디렉토리와 일치합니다. 패턴 뒤에 /가 있으면 디렉터리와 하위 디렉터리 만 일치합니다.

0 이 단락의 ”는 dir/file.ext가 포함되어야한다는 인상을줍니다. 뭔가 빠진 게 없다면.

댓글

  • 이 캐릭터는 무엇인가요? ɀ?
  • 어떤 플랫폼에서 어떤 버전의 bash가 있습니까? ' Debian wheezy의 bash 4.2.37 또는 Debian squeeze의 bash 4.1.5로이를 재현 할 수 없습니다. @slm unicode ɀ 또는 Wikipedia
  • @Gilles 프롬프트입니까?
  • slm, 예! ɀ는 여기에서 프롬프트를 구분하는 데 사용되는 문자입니다. 일부 사용자는 $ 대신 £ 또는 문자를 선호합니다. 🙂 원래는 ɀ 특수 아프리카 언어 표기법을 위해 만들어진 ' z ' 문자입니다. )
  • " GNU bash, 버전 3.2.53 (1)-릴리스 (x86_64-apple-darwin13) " OS X 10.9와 함께 제공되는이 동작이 있습니다.

답변

하위 디렉토리 수준 만 참조하는 것 같습니다. . ** / 일치

  1. 모든 파일 및 디렉토리

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

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

dir/*.ext dir/**/*.ext.

댓글

  • 예, 제 폴백입니다. 예쁘지 않습니다. 😉

Answer

이것은 나열된 배포판과 함께 제공되는 Bash 버전에서 예상대로 작동합니다. :

  • 4.1.2 (1) — CentOS 6.5
  • 4.1.5 (1) — Debian 6.0.10
  • 4.1.10 (4 ) — Cygwin 1.7.31
  • 4.2.46 (1) — CentOS 7.1
  • 4.3.11 (1) — Ubuntu 14.04.1
  • 4.3.30 (1) — Debian 8.1

사실 위에 나열된 버전은 제가 테스트 한 모든 버전입니다. 즉, 작동하지 않는 Bash 버전 4를 찾지 못했습니다. 옵션 globstar가 Bash 4.0에 추가되었습니다. 변경 사항 을 참조하세요. 이전 버전에서는 shopt -s globstar 명령이 오류를 반환해야합니다.

테스트

1 . dir/**/*.extdir/file.ext :

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

댓글

  • 올바른 대답. OP에서 shopt -s globstar 설정을 잊었습니다.

답변

I globstar가 꺼져 있거나 꺼진 것처럼 보입니다. 다음과 같이 켤 수 있습니다.

shopt -s globstar 

0 개의 하위 디렉터리와 일치하지 않을뿐만 아니라 두 개의 하위 디렉터리와도 일치하지 않습니다.

$ 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

$ echo dir/*/*.ext dir/subdir1/file.ext dir/subdir2/file.ext 

때로는 globstar가 켜져 있다고 생각하도록 속이는 경우

현재 globstar 설정을 다음과 같이 확인하세요. 이 :

shopt | grep globstar 

댓글

.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다