【问题标题】:Using wildcards to exclude files with a certain suffix使用通配符排除特定后缀的文件
【发布时间】:2012-07-11 16:18:36
【问题描述】:

我正在 bash 中尝试使用通配符,并尝试列出所有以“xyz”开头但不以“.TXT”结尾但得到不正确结果的文件。

这是我尝试过的命令:

$ ls -l xyz*[!\.TXT]

它没有列出我目录中名称为“xyz”和“xyzTXT”的文件。但是,它列出了“xyz1”、“xyz123”。

似乎在“xyz*”之后添加[!\.TXT] 会使shell 查找以“xyz”开头并且后面至少有一个字符的内容。

任何想法为什么会发生以及如何更正此命令?我知道它可以使用其他命令来实现,但我特别想知道它失败的原因以及它是否可以仅使用通配符来完成。

【问题讨论】:

    标签: linux bash wildcard


    【解决方案1】:

    这些命令会做你想做的事

    shopt -s extglob
    ls -l xyz!(*.TXT)
    shopt -u extglob
    

    您的命令不起作用的原因是因为 xyz*[!\.TXT] 相当于 xyz*[!\.TX] 表示 xyz 后跟任何字符序列 (*),最后是一个字符设置 {!,\,.,T,X} 所以匹配 'xyzwhateveryouwant!' 'xyzwhateveryouwant' 'xyzwhateveryouwant'。 'xyzwhateveryouwantT' 'xyzwhateveryouwantX'

    编辑:whateveryouwant 不包含任何 !\.TX

    【讨论】:

    • 是的,这很有效,非常感谢这个解决方案,但是知道为什么我尝试的命令对文件“xyz”和“xyzTXT”不起作用吗?
    • 您的命令匹配所有以 xyz 开头并以 !\.TX 中的任何字符结尾的文件
    • 我用命令创建了两个文件:touch xyz!并触摸 xyz。第一个以 !被列出,但不是以 . 结尾的第二个。 (点),我想!用于否定,但为什么它打印文件 xyz!仍然是个谜。
    • 啊,好的,我明白了。根据 Zagorax 在文件 xyz 上的评论!应列出,因为它不以任何字符 \、.、X、T 结尾
    【解决方案2】:

    我认为仅使用通配符是行不通的。

    您的命令不起作用,因为这意味着:

    匹配所有具有xyz 后跟任何你想要的字符,并且它不能以后续字符结尾:\.TX。第二个T 不算数,因为[] 中的内容被读取为字符族,而不是您想象的字符串。

    您也不需要“转义”.,只要它在通配符中没有特殊含义即可。

    至少,这是我对通配符的了解。

    【讨论】:

    • 我想这是有道理的。谢谢。
    • @RameshSamane,做一些测试,例如,使用名为 xyzwhateverTXTyouwantxyzwhateveryouwant.xyzwhateveryouwantX 的文件。您的方法适用于第一个,但会失败其他两个。
    猜你喜欢
    • 2019-03-24
    • 1970-01-01
    • 2012-05-17
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多