通配文件名的一部分,ls 表示它存在:
$ ls *rammar*
London_Grammar_-_Hey_Now_Official_Video-nMEHJPuggHQ.mp4
London_Grammar_-_Hey_Now_Radio_1_s_Big_Weekend_2014-on1QEcz1sTI.webm
London_Grammar_-_Interlude_Live_on_KEXP-7eNA90LlxmY.mp4
通配文件名的另一部分,ls 表示它不存在:
$ ls *7eNA9*
ls: cannot access `*7eNA9*`: No such file or directory
ls 没有别名
返回码(通过echo $?
):
2
男人ls:
Exit status:
2 if serious trouble (e.g., cannot access command-line argument).
中央操作系统
7.5.1804
重击
4.2.46(2)
核心工具
GNU v8.22
Shell globbing 模式将扩展为与其匹配的任何名称,无论该名称是常规文件的名称还是目录的名称。当
ls
在命令行上给出目录的名称时,它将列出其内容。似乎
ls
for报告的一个或多个名称ls *rammar*
可能来自名称与该模式匹配的目录。其中一个文件是ls
输出中的最后一个文件。这就是为什么当您尝试第二个命令时,找不到该文件的原因。它在当前目录中不可用。
评论要点总结:
我建议
会找到该文件,并补充说
*7eNA90*
在这种情况下引用模式很重要,这样 shell 就不会尝试扩展它(它由 使用find
)。@iletras 尝试了这个并且它有效,但他也发现它在没有引号的情况下也有效。它在没有引号的情况下工作,因为在当前目录中没有与模式匹配的内容,因此 shell 使模式保持未扩展。
但是,养成依赖这种行为的习惯是危险的,因为在一般情况下,人们可能并不总是知道或记住当前目录中可用或将可用的名称。一些 shell 还具有用于将不匹配模式扩展为空字符串的
nullglob
shell 选项,例如bash
. 如果模式未引用,则设置此 shell 选项将使命令失败。简单地引用模式比依赖环境更安全。