在 bash 中使用扩展通配符列出文件而不是目录

seb*_*elk 3 ls bash wildcards

假设我有以下目录树:

\n\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 11\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 111\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 112\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 1121\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 113\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 11a\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 11a1\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 1a1\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 1a2\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 1aa1.png\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 2a1\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 a.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 a1a\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 a1a.jpg\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 a2a\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 aa\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 -aa\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 aa.gif\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 aa.jpg\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 aa.png\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 aa.tiff\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 a.exe\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 a.gif\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 a.html\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 a.jpg\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 a.png\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 a.tiff\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 b2\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 b2a\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ba.gif\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ba.jpg\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ba.png\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ba.tiff\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 b.html\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 cb1.png\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 d.gif\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 sub1\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 d.gif\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 sub2\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以,如果我想匹配 . ($PWD) 但是带有“.jpg”扩展名的文件,我执行以下操作:

\n\n
ls !(*.jpg)\n
Run Code Online (Sandbox Code Playgroud)\n\n

但它输出:

\n\n
11   1121  11a1  1aa1.png  a1a  aa.gif   a.exe   a.png   b2a     ba.tiff  d.gif\n111  113   1a1   2a1       a2a  aa.png   a.gif   a.tiff  ba.gif  b.html   .gif\n112  11a   1a2   a.        aa   aa.tiff  a.html  b2      ba.png  cb1.png\n\nsub1:\n.  ..  d.gif  sub2\n
Run Code Online (Sandbox Code Playgroud)\n\n

我想排除 sub1 及其所有内容(甚至目录),即:

\n\n
\n
sub1:\n.  ..  d.gif  sub2\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

我可以排除使用:

\n\n

GLOBIGNORE=\'sub1\'在 ls 之前,但是如果我有更多具有不同名称的目录会发生什么?

\n\n

有没有办法做到这一点?

\n

thr*_*rig 5

一定要有壳bash吗?通过 ZSH 和EXTENDED_GLOBset,我们可以(.)将 glob 表达式限定()为纯文件.

$ PS1='%% ' zsh -f
% setopt EXTENDED_GLOB
% mkdir foo && cd foo
% touch nope.jpg
% mkdir sub1
% touch asdf
% print ^*.jpg
asdf sub1
% print ^*.jpg(.)
asdf
% 
Run Code Online (Sandbox Code Playgroud)