繁体   English   中英

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

[英]Linux: How to list all files/directories, using only ls

这是大学提出的问题。

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

ls testfiles | grep -v "\."

现在,只是为了理解ls正则表达式如何工作,有人可以通过仅使用ls向我解释这是怎么回事吗? 此外,我会感谢任何也使用美元符号$例子,具体说明该名称以.[az]结尾。

任何帮助,真的很感激。

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

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

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

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

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

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

但你确实理解grep "\\." 用“句号”(因此,扩展名)和grep -v "\\."匹配所有内容grep -v "\\." 匹配其他一切(即补充)。

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


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

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

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

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

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

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

更正:

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

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

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

您可以使用ignore标志执行此操作:

ls -I '*.*'

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM