列出不以特定前缀开头的文件

列出不以特定前缀开头的文件

我只需要列出目录中不以qc_dl,qc_dtqd_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

相关内容