extglob 부정이 예상대로 작동하지 않습니다.

extglob 부정이 예상대로 작동하지 않습니다.

부정을 사용하여 디렉터리를 제외하려고 시도했지만 디렉터리가 여전히 패턴 일치에 나타납니다.

bash-4.3$ ls
file_1.txt  testdir
bash-4.3$ shopt extglob
extglob         on
bash-4.3$ echo !(*/)
file_1.txt testdir
bash-4.3$ 

내가 뭘 잘못했나요?

for참고: 루프 [나 명령을 사용할 수 있다는 것을 알고 있지만 구체적으로 알아내고 find싶습니다 .extglob

답변1

당신은 , , ... /에 있을 수 없습니다 .@(...)!(...)*(...)

/glob 사이에만 나타나거나 a[x/y]b고려될 수도 있습니다 @(a\[x)/@(y\]b). glob은 먼저 분할 /되고 각 부분은 디렉터리의 내용과 일치됩니다. 그러나 ksh glob 확장자가 있는 경우 내부 확장자는 x(...)분할되지 않지만 각 glob 부분은 여전히 ​​파일 이름과 일치합니다. 에서는 현재 디렉터리의 모든 파일 이름과 일치합니다. 분명히 파일 이름에는 포함할 수 없으므로 일치하는 항목이 없으므로 모든 파일과 일치합니다./(...)!(*/*)*/*/!(*/*)

zsh여기서는 glob 한정자를 사용해야 합니다 .

echo *(^/)

디렉토리를 제외한 모든 유형의 파일에서 작동합니다. 또는 's (디렉토리 유형의 모든 파일) bash의 반대 입니다.*/심볼릭 링크 해결 후):

echo *(-^/)

(디렉토리도 아니고 디렉토리 심볼릭 링크도 아닌 파일)

관련 정보