나는 다음과 같은 것을 쓰고 싶다 :
$ ls **.py
모든 .py 파일 이름을 얻으려면 디렉터리 계층 구조를 재귀적으로 순회하세요.
찾을 .py 파일이 있더라도 셸(bash)은 다음과 같은 출력을 제공합니다.
ls: cannot access **.py: No such file or directory
내가 원하는 것을 할 수 있는 방법이 있나요?
편집하다:나는 특정 사례에 관심이 없다는 점을 지적하고 싶습니다 ls
. 그러나 질문은 glob 구문에 관한 것입니다.
답변1
Bash에서 재귀 glob을 수행하려면 globstar
Bash 버전 4 이상의 기능이 필요합니다.
~에서배쉬 문서:
globstar
**
설정된 경우 파일 이름 확장 컨텍스트에 사용된 패턴은 모든 파일과 0개 이상의 디렉터리 및 하위 디렉터리와 일치합니다. 패턴 뒤에 가 오면/
디렉터리와 하위 디렉터리만 일치합니다.
예제 패턴의 경우:
shopt -s globstar
ls -d -- **/*.py
shopt -s globstar
실행하려면 실행해야 합니다 .이 기능은 bash에서 기본적으로 활성화되어 있지 않으며 shopt
실행하여 활성화할 수 있습니다.
답변2
find . -name '*.py'
**한 번만 실행* 작업, 둘 다 현재 디렉터리에서 작동
답변3
Bash 4부터 시작(zsh도 포함)새로운 와일드카드 옵션모드를 설정할 때 모드를 다르게 처리하는 ()을 추가했습니다 globstar
.**
와일드카드 패턴을 일치시킨 다음 명령의 와일드카드 패턴을 일치하는 항목으로 바꿔 일치하는 파일 및 디렉터리 이름을 반환합니다.
일반적으로 사용하면 **
유사하게 작동 *
하지만 모든 디렉터리를 반복적으로 반복합니다(루프처럼).
활성화되어 있는지 확인하려면 shopt globstar
(스크립팅에서 사용 shopt -q globstar
)을 통해 확인하세요.
이 예제는 **.py
반복될 수 있는 디렉터리 목록을 반환하지 않으므로 현재 디렉터리에 대해서만 작동합니다. 따라서 **/*.py
더 깊이 들어가려면 여러 디렉터리 수준 와일드카드를 사용해야 합니다.
이봐재귀적으로 파일을 찾는 예.