이 파일 트리가 있습니다.
a.py
b/c.py
Bash에서는 ls -l **/*.py
주어진
b/c.py
Zsh에서는 ls -l **/*.py
좋은
a.py
b/c.py
이를 방지하기 위해 bash 동작을 변경할 수 있는 방법이 있습니까 ls *.py **/*.py
?
추신: 사용했지만 ls
문제는 모든 명령에 있습니다.
답변1
일반 sh 및 일반 sh 이전 버전과 호환되는 쉘에서 모드 **
및 *
는 동일합니다. Zsh는 여러 가지 방법으로 sh 호환성에서 벗어납니다. 그 중 하나는 모드 **/
와 ***/
작업 입니다.재귀 와일드카드. **/…
현재 디렉터리, 해당 하위 디렉터리, 하위 하위 디렉터리 등을 검색할 ***/…
뿐만 아니라 하위 디렉터리에 대한 기호 링크도 통과합니다.
Bash ≥4.3에서 유사한 기능을 활성화할 수 있습니다.shopt -s globstar
, ksh93에서 set -o globstar
/ 와 함께 set -G
. 기타 관련 옵션은 다음과 같습니다.
shopt -s dotglob
와일드카드 패턴이 도트 파일과 일치하도록 만듭니다( zsh 의set -o dotglob
/ 와 유사globdots
).GLOBIGNORE
변수를 설정하면bash
이 옵션도 자동으로 활성화됩니다.- ksh93을 사용하면 비슷한 효과를 얻을 수 있습니다
FIGNORE=.:..
. - zsh에서는
(D)
사례별로 패턴에 따라 glob 한정자를 사용하여 이 작업을 수행할 수도 있습니다. Bash/ksh93에는 유사한 기능이 없습니다.
shopt -s extglob
ksh88 스타일 확장 glob 연산자(set -o kshglob
zsh와 유사)를 활성화합니다(ksh에서는 항상 활성화됨).- zsh는 또한
set -o extendedglob
다른 구문으로 임의의 정규식(부정 연산자 사용)을 표현하는 대체 방법을 제공합니다. Bash에는 이 구문에 해당하는 구문이 없습니다.
- zsh는 또한
shopt -s nocaseglob
set -o nocaseglob
패턴 일치를 대소문자를 구분하지 않게 만듭니다( zsh 의 / 와 유사set +o caseglob
).- zsh에서는 패턴 접두어를 붙여 사례별로 수행할 수 있습니다
(#i)
. 마찬가지로 ksh93에서는 패턴 접두어를 붙일 수 있습니다~(i)
. Bash에는 유사한 기능이 없습니다.
- zsh에서는 패턴 접두어를 붙여 사례별로 수행할 수 있습니다
shopt -s nullglob
일치하는 파일이 없으면 패턴을 변경하지 않고 그대로 두는 대신 glob 패턴이 빈 목록으로 확장됩니다(set -o nullglob
zsh와 유사).- zsh에서는
(N)
패턴에 따라 glob 한정자를 사용하여 사례별로 이를 수행할 수 있습니다. ksh93에서는~(N)
모드가 앞에 옵니다. Bash에는 유사한 기능이 없습니다.
- zsh에서는
shopt -s failglob
패턴을 변경하지 않고 그대로 두는 대신 일치하는 파일이 없으면 오류를 트리거합니다(zsh의 기본 동작).set -o globstarshort
예를 들어, .in 과 유사 하지만 ( 확장자에 포함된 것을 제외하고) 동일 하게zsh
작성할 수도 있습니다 .**
**/*
**/*.py
**.py
bash -O globstar
**
**/*
dir/**
dir/
**.py
*.py
Bash 4.0에서는 이 globstar
옵션과 **
모드를 도입했지만, bash 4.3 이전에는 항상 디렉터리의 심볼릭 링크를 순회했지만 5.0 이전에는 디렉터리의 심볼릭 링크를 순회했습니다.일부심볼릭 링크. Bash 3.x 이하에는 그러한 기능이 없습니다.
tcsh
유사한 형태의 재귀 와일드카드를 , yash
및 셸 에서도 사용할 수 있습니다 fish
(기본적으로 활성화되어 있지 않음).
.
¹ 이러한 쉘 과 ..
특수 디렉토리 사이에는 약간의 차이점이 있다는 점에 유의하십시오 . 이들은 zsh
glob에 의해 확장되지 않으며 설정은 ksh93 의 glob에서 제외되지만 bash에서는 Even with FIGNORE=.:..
와 같이 glob에서 제외되지만 . 설정은 도움이 되지만 그렇지 않습니다 .*
dotglob
.*
GLOBIGNORE=.:..
.*
dir/.*
.*/file