首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >命令"ls .*“和"ls *”的不同输出。

命令"ls .*“和"ls *”的不同输出。
EN

Unix & Linux用户
提问于 2013-12-31 10:55:28
回答 2查看 5.7K关注 0票数 3

命令

代码语言:javascript
运行
复制
    ls .*

当运行作为输出时,如下所示:

  • 开头的当前目录中的所有文件。(隐藏文件)
  • 当前目录中隐藏目录中的所有文件。
  • 当前目录中的所有文件
  • 父目录中的所有文件

为什么命令

代码语言:javascript
运行
复制
    ls *.

不显示:

  • 当前目录中的所有文件
  • 父目录中的所有文件

我这么想的原因是:正则表达式*。两者都应该匹配。然后..。因此,ls应该同时在这两种情况下运行,因此,应该显示我期望的输出。

EN

回答 2

Unix & Linux用户

发布于 2013-12-31 11:17:38

文件名展开的规则有一个特例,将.作为文件名中的第一个字符:必须显式匹配它(即模式必须包含开始的.,或在/之后的. )。否则,这些文件不是候选文件。

这就是为什么您的第一个版本会选择以.开头的文件名,而第二个版本则不会,*并不将.与文件名的第一个字符相匹配。

命令语言将其描述为:

如果文件名以句点(‘.“)开头,则应使用句点作为模式的第一个字符或紧跟斜杠字符,显式匹配句点。前导期不应与下列情况相匹配:

  • 星号或问号特殊字符
  • 包含不匹配列表(如"阿!“)、范围表达式(如"%-0”)或字符类表达式(如“[*点球:])的括号表达式。

未指定括号表达式匹配列表中的显式句点(如".abc“)是否可以匹配文件名中的前导句点。

您的shell可能有更改此行为的选项。例如,Bash具有这样的功能(文件名展开):

当一个模式用于文件名展开时,字符‘.’除非设置了shell选项,否则必须在文件名开始时或紧接斜杠后面显式匹配。匹配文件名时,必须始终显式匹配斜杠字符。在其他情况下,“.”性格不是被特别对待的。

请注意,这些不是正则表达式。.*作为正则表达式将完全匹配任何内容(包括任何内容)。*.将是畸形的.

票数 5
EN

Unix & Linux用户

发布于 2020-02-19 17:54:33

请注意,这实际上与ls无关。您正在使用的shell执行球形操作(更普遍地说,是替换)。您提供的*.*由shell扩展(全局)到所有与*匹配的对象名称(没有启动.的所有东西,这里的一个.是特例)或.* (其名称开始于.的所有东西)。该列表将传递给ls (或调用任何不幸的命令),而现在则由该命令负责。您的命令永远不会知道它们是用*调用的,还是您辛苦地写出了所有的名称。

其基本原理是,它简化了数百条命令(字面意思),并使它们的“参数处理”统一(根本不做;-)。缺点是您不能说mv *.txt *.bak,因为您希望将所有.txt文件移动到同名的.bak。哦,好吧。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/107263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档