![](/img/trans.png)
[英]Hiding all directories that begin with a capitalized letter using `ls` in zsh
[英]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发行版。
由于您使用bash标记了问题,因此您不需要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.