재귀적인 전역?

재귀적인 전역?

나는 다음과 같은 것을 쓰고 싶다 :

$ ls **.py

모든 .py 파일 이름을 얻으려면 디렉터리 계층 구조를 재귀적으로 순회하세요.

찾을 .py 파일이 있더라도 셸(bash)은 다음과 같은 출력을 제공합니다.

ls: cannot access **.py: No such file or directory

내가 원하는 것을 할 수 있는 방법이 있나요?

편집하다:나는 특정 사례에 관심이 없다는 점을 지적하고 싶습니다 ls. 그러나 질문은 glob 구문에 관한 것입니다.

답변1

Bash에서 재귀 glob을 수행하려면 globstarBash 버전 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더 깊이 들어가려면 여러 디렉터리 수준 와일드카드를 사용해야 합니다.

이봐재귀적으로 파일을 찾는 예.

관련 정보