【问题标题】:Linux: How to list all files/directories, using only lsLinux:如何列出所有文件/目录,仅使用 ls
【发布时间】:2013-03-14 09:31:03
【问题描述】:

这是大学时提出的问题。

问题是:列出testfiles 文件夹中所有没有扩展名的文件/目录。
给出的正确答案是这样的:

ls testfiles | grep -v "\."

现在,只是为了了解ls 正则表达式的工作原理,有人可以解释我只使用ls 会怎样吗?此外,我将不胜感激任何也使用美元符号$ 的示例,以明确说明名称以.[a-z] 结尾。

任何帮助,非常感谢。

还有一件事!这个问题的另一个答案是使用:

ls testfiles | grep "^[^.]*$"

这是怎么读的?我这样读^[^.]*$

^      -> does not contain
[^.]   -> starts with a dot
*      -> repeated zero or more times
$      -> till the end

我希望有人对此进行纠正... 谢谢!

【问题讨论】:

  • 我认为你不能只使用ls
  • ls 使用扩展的 glob 语法,而不是正则表达式。看看this 的想法。
  • [^.] 作为正则表达式匹配任何单个字符除了句点。
  • 您的正则表达式分析不太正确,开头的^ 是开始锚点。因此,该模式实际上匹配任意数量的从头到尾不是点的字符。
  • 你在“|”处失去了我。如果要求是“仅 ls”,那么 grep 在那里做什么?

标签: regex linux bash grep ls


【解决方案1】:

Unix 实用程序旨在用作过滤器,因此给出的答案是有道理的,因为它最接近现实世界的应用程序。

不过,您确实明白,grep "\." 匹配带有“句点”(因此是扩展名)的所有内容,grep -v "\." 匹配其他所有内容(即补码)。

很难使命令比现有的更精确,因为谁能说什么是扩展,什么不是?


第 2 部分:ls testfiles | grep "^[^.]*$"

括号表达式是由 [ 和 ] 括起来的字符列表。 它 匹配该列表中的任何单个字符;如果第一个字符 列表是插入符号 ^ 然后它匹配不在列表中的任何字符。 例如,正则表达式 [0123456789] 匹配任何单个 数字。

http://unixhelp.ed.ac.uk/CGI/man-cgi?grep

所以^[^.]*$实际上的意思是:

任何以字符串开头和结尾的字符串,每个字符串都不是句点。

第一个插入符号不是否定,它表示开头。第二个插入符号是“非”符号。

【讨论】:

  • “所以^[^.]*$ 实际上的意思是:任何以非句点的字符开头和结尾的东西。”不,这意味着从头到尾只有非句点字符的任何内容。
  • 我的意思是,任何以字符串开头和结尾的字符串,每个字符串都不是句点...这是一种罗嗦的表达方式。
【解决方案2】:

更正:

^      -> pattern starts at the beginning of the string
[^.]   -> matches something that is not a dot
*      -> repeated zero or more times
$      -> and must continue to match (only non-dot items) until the end

因此,它必须从头到尾只有非点的东西。

【讨论】:

    【解决方案3】:

    现在,只是为了了解 ls 正则表达式的工作原理,有人可以向我解释一下如何仅使用 ls [完成] 吗?

    您可以使用忽略标志来做到这一点:

    ls -I '*.*'
    

    注意 - 适用于 CentOS 6,不确定其他 Linux 发行版。

    【讨论】:

    • 我可以!但基本上我正在研究如何将grep 转换为ls。这意味着,通过使用正则表达式。 -I 确实可以解决问题,但这并不是我想要的。我认为 borries591 的答案是最好的:“ls 使用扩展的 glob 语法,而不是正则表达式”。不过,还是谢谢你...
    • @m.spyratos 这实际上并不完全正确——ls 不能识别 glob 语法 正则表达式本身,除非您使用诸如 -I 之类的扩展名这里给出的标志。 shell 在启动之前将 glob 转换为文件列表 ls.
    【解决方案4】:

    由于您使用 标记了问题,因此您不需要 grep:

    shopt -s extglob
    (cd testfiles && ls -d !(*.*))
    

    http://www.gnu.org/software/bash/manual/bashref.html#Pattern-Matching

    【讨论】:

      猜你喜欢
      • 2019-07-06
      • 1970-01-01
      • 2012-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-16
      • 1970-01-01
      相关资源
      最近更新 更多