ZSH: `ls *(.)`는 일반 파일만 나열하지만 `ls *(/)`는 디렉토리만 나열하지 않습니다.

ZSH: `ls *(.)`는 일반 파일만 나열하지만 `ls *(/)`는 디렉토리만 나열하지 않습니다.

ZSH의 와일드카드를 올바르게 사용하고 있는지 잘 모르겠지만 ls *(/)아래의 디렉터리만 나열할 것이라고 생각했는데 pwd그렇지 않습니다. 각 디렉터리 아래의 모든 파일을 재귀적으로 나열합니다 pwd(저는이것유용한 zsh 팁 목록)

현재 경로 아래의 디렉토리를 구체적으로 나열하기 위한 올바른 와일드카드 문자는 무엇입니까?

답변1

나는 문제가 zsh globbing이 아니라 ls디렉토리 인수가 주어졌을 때 디렉토리의 내용을 나열하는 기본 동작이라고 생각합니다.

한번 시도해 보시길 권합니다

ls -d -- <your-glob-here>

글로브를 테스트하는 가장 좋은 방법은 다음과 같습니다.

printf '%s\n' <glob>

또는

print -rC1 -- <glob>

답변2

이를 구현하는 또 다른 방법은

 print *(/)

또는

 echo *(/)

업데이트 1

조금@Stéphane Chazelas가 지적한 것처럼 올바른 버전은 다음과 같습니다.

print -rl -- *(/) 

또는

echo -E - *(/)

파일 이름에 공백(-l), 이스케이프 시퀀스(-r/-E) 및 선행 하이픈(-/-)을 기록해 두십시오.

업데이트 2

하지만심지어올바른 버전은 print -rN결과를 null 값으로 구분하여 파일 이름 내 줄 바꿈(Linux에서는 허용, Windows에서는 허용되지 않음)을 추가로 처리하는 것입니다. 예를 들면 다음과 같습니다.

print -rN -- **/*(/) |xargs -0 -n10 chmod g+s

setguid 비트를 재귀적으로 설정합니다. 즉, 가 아닌 디렉토리 주소를 선택적으로 지정합니다 chmod -R g+s.

업데이트 3

거대한 트리의 경우 명령줄 길이 제한으로 인해 파일의 일부만 처리하고 나머지는 자동으로 남겨둡니다. 다음 명령은 이 상황을 처리합니다.

find . -type d -print0 |xargs -0 -n10 chmod g+s

답변3

현재 디렉터리의 모든 디렉터리 유형 나열

ls -d -- *(/)
ls -d *(/)

그렇지 않으면 사용

ls -d */**(/)

모든 디렉터리를 재귀적으로 나열합니다.

관련 정보