Linux:如何仅使用ls列出所有文件/目录

时间:2013-03-25 00:04:41

标签: regex linux bash grep ls

这是大学提出的问题。

问题是:列出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

我希望有人在此纠正我... 谢谢!

4 个答案:

答案 0 :(得分:3)

Unix实用程序应该用作过滤器,因此给出的答案是有意义的,因为它最接近真实世界的应用程序。

但您确实理解grep "\."匹配所有内容的“句号”(因此,扩展名),grep -v "\."匹配其他所有内容(即补语)。

很难让命令比现在更精确,因为谁可以说什么是扩展名,什么不是?


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

  

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

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

所以^[^.]*$实际上意味着:

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

第一个插入符不是否定,它意味着开始。第二个插入符号是“非”符号。

答案 1 :(得分:3)

校正:

^      -> 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

因此,从开始到结束,它必须只有非点数。

答案 2 :(得分:3)

  

现在,只是为了理解ls正则表达式是如何工作的,有人可以通过仅使用ls向我解释这将是如何完成的吗?

您可以使用ignore标志:

ls -I '*.*'

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

答案 3 :(得分:0)

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

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

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