Glob模式,用于匹配不以特定字符串开头的非隐藏文件名

时间:2013-05-14 23:36:05

标签: bash glob

我一般都缺乏经验。如何编写一个匹配文件名而不是的glob模式,例如“ab”,但还需要至少2个的长度?即“以”ab“之外的2字母字符串开头”这是一个家庭作业问题,只允许使用基本的bash globs,并且必须使用“echo< glob here>”。

注意:逐字的问题是

  当前目录中的

(非隐藏)文件,其名称至少包含两个字符,但不以ab开头。

印在纸上。我很确定我没有误解任何事情。要求是

  

对于以下每个文件搜索条件,请提供匹配的通配模式   标准。在每种情况下,您的答案应该是一个文本文件,格式如下:

echo <pattern>

我当前的尝试是echo {a[!b]*,[!a.]?*},但不知何故,自动评分器实际上无需人为干预即可自动对照测试用例运行文件。

4 个答案:

答案 0 :(得分:3)

对于单个字母,这样做:

$ echo [!a]?*

然而,对于2个字母(假设文件也可以从数字或标点符号或其他各种东西开始),我只能在不考虑shopt的情况下考虑这个问题:

$ GLOBIGNORE=ab* 
$ echo *

嗯,现在,从技术上讲,这可行:

$ echo [!a]?* [a][!b]*

但如果没有文件以[a][!b]* + 1个或更多额外字符开头,这会在我们的结果中留下令人讨厌的a,这不仅是不合需要的,但即使在任何申请中都被认为是一个错误,所以基于这个理由我不认为这是一个有效的答案。要省略[a][!b]*,我们 要诉诸nullglob(如果不允许extglobnullglob可能也不是:

$ shopt -s nullglob
$ echo [!a]?* [a][!b]*

Fwiw,extglob将是:

$ shopt -s extglob

$ echo!(ab *) 之前的答案将匹配少于2个字符的文件,所以就像@perreal所说:

$ @([^a]?|?[^b])*

答案 1 :(得分:2)

以“a”或“b”开头或“ab”开头?对于后者:

ab*

毋庸置疑,您必须指定一个解析的路径(相对或绝对):

/path/to/ab*

更新您的问题:

{b,c,d,e,f...}{a,c,d,e,f...}*

应该有用,请注意...实际上并不有效,但我不会在这里写整个字母。 :P

答案 2 :(得分:1)

shopt -s extglob         # turn on extended globbing
echo @([^a]?|?[^b])*

答案 3 :(得分:0)

我原来的echo {a[!b]*,[!a.]?*}是正确的,效果很好。老师实际上把测试用例设置错了,所以每个人都被标记错误并且刚刚得到了一个评论。