命令
ls .*
当运行作为输出时,如下所示:
为什么命令
ls *.
不显示:
我这么想的原因是:正则表达式*。两者都应该匹配。然后..。因此,ls应该同时在这两种情况下运行,因此,应该显示我期望的输出。
发布于 2013-12-31 11:17:38
文件名展开的规则有一个特例,将.
作为文件名中的第一个字符:必须显式匹配它(即模式必须包含开始的.
,或在/
之后的.
)。否则,这些文件不是候选文件。
这就是为什么您的第一个版本会选择以.
开头的文件名,而第二个版本则不会,*
并不将.
与文件名的第一个字符相匹配。
命令语言将其描述为:
如果文件名以句点(‘.“)开头,则应使用句点作为模式的第一个字符或紧跟斜杠字符,显式匹配句点。前导期不应与下列情况相匹配:
未指定括号表达式匹配列表中的显式句点(如".abc“)是否可以匹配文件名中的前导句点。
您的shell可能有更改此行为的选项。例如,Bash具有这样的功能(文件名展开):
当一个模式用于文件名展开时,字符‘.’除非设置了shell选项,否则必须在文件名开始时或紧接斜杠后面显式匹配。匹配文件名时,必须始终显式匹配斜杠字符。在其他情况下,“.”性格不是被特别对待的。
请注意,这些不是正则表达式。.*
作为正则表达式将完全匹配任何内容(包括任何内容)。*.
将是畸形的.
发布于 2020-02-19 17:54:33
请注意,这实际上与ls
无关。您正在使用的shell执行球形操作(更普遍地说,是替换)。您提供的*
或.*
由shell扩展(全局)到所有与*
匹配的对象名称(没有启动.
的所有东西,这里的一个.
是特例)或.*
(其名称开始于.
的所有东西)。该列表将传递给ls
(或调用任何不幸的命令),而现在则由该命令负责。您的命令永远不会知道它们是用*
调用的,还是您辛苦地写出了所有的名称。
其基本原理是,它简化了数百条命令(字面意思),并使它们的“参数处理”统一(根本不做;-)。缺点是您不能说mv *.txt *.bak
,因为您希望将所有.txt
文件移动到同名的.bak
。哦,好吧。
https://unix.stackexchange.com/questions/107263
复制相似问题