我只需要列出目录中不以qc_dl
,qc_dt
或qd_df
开头但也以.sas
.
我可以列出不以“qc_dl”开头的文件,如下所示:
ls -I "qc_dl*"
但后来我不知道如何从结果列表中仅选择 SAS 程序。
此外,我可以选择以“qc_dl”、“qc_dt”或“qd_df”开头的所有 SAS 文件,如下所示:
ls qc_d{l,t,f}*.sas
但是,我无法组合这两个命令来仅列出不以qc_dl/t/f
.
答案1
代替使用find
?
find /my/example/dir -type f -name '*.sas' ! -name 'qc_d[ltf]*'
答案2
来自 man bash:
如果使用内置 shopt 启用 extglob shell 选项,则会识别多个扩展模式匹配运算符。在下面的描述中,模式列表是由 | 分隔的一个或多个模式的列表。复合图案可以使用以下子图案中的一种或多种来形成:
?(pattern-list) Matches zero or one occurrence of the given patterns *(pattern-list) Matches zero or more occurrences of the given patterns +(pattern-list) Matches one or more occurrences of the given patterns @(pattern-list) Matches one of the given patterns !(pattern-list) Matches anything except one of the given patterns
启用此功能后,您可以使用更强大的模式匹配。
打开它:
~$ shopt -s extglob
然后您可以列出以 结尾.sas
且不以 开头的文件qc_d
:
~$ ls
a.sas a.txt b.sas b.txt c.sas c.txt qc_dc.sas qc_df.sas qc_dl.sas qc_dt.sas
~$ ls !(qc_d*).sas
a.sas b.sas c.sas
要将其关闭:
~$ shopt -u extglob
答案3
假设文件名不包含换行符并且不以 开头.
,这应该有效:
ls -d -- *.sas | grep -v '^qc_d[ltf]'
列出以 .sas 结尾的文件并过滤所有非 qc_dl、qc_dt、qc_df 的文件
对于任何过滤需求,grep 都是您的朋友。
答案4
ls -d [![.qc_dl.][.qc_dt.][.qd_df.]]*.sas 参考“man 7 glob” [!...] -> 任何东西,但不属于该类,相当于 grep 或正则表达式中的 [^...] [.qc_dl.] -> 精确的模式来精确地处理“qc_dl”内部 类而不是任何字符或范围出现 场景:嘿,shell 先生,请为我列出所有未开始的事情 在“qc_dl”、“qc_dt”或“qd_df”中,但如果其中任何一个结尾 有了 .sas 那么你就可以列出它们了。 实验: $ 触摸 qc_dloooooooo.sas $ 触摸 qc_dloooooooo $触摸qc_dtfffghhjh.sas $触摸qc_dtfffghhjh $ 触摸 cvvvbkkk $ 触摸 cvvvbxcvvcxv $ ls -d [![.qc_dl.][.qc_dt.][.qd_df.]]*.sas qc_dloooooooo.sas qc_dtfffghhjh.sas