对文件名的一部分进行通配符, 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
答案1
shell 通配符模式将扩展为任何与其匹配的名称,无论该名称是常规文件还是目录的名称。当ls
在命令行上给出目录名称时,它将列出其内容。
似乎ls
for报告的一个或多个名称ls *rammar*
可能来自名称与该模式匹配的目录。这些文件之一是ls
输出中的最后一个文件。
这就是为什么当您尝试第二个命令时,找不到该文件。它在当前目录中不可用。
评论要点总结:
我建议
find . -type f -name '*7eNA90*`
会找到该文件,并且还补充说,在这种情况下引用该*7eNA90*
模式很重要,这样 shell 就不会尝试扩展它(它由find
)使用。
@iletras 尝试了这个并且它有效,但他也发现它有效没有引号。它可以在没有引号的情况下工作,因为当前目录中没有任何内容与模式匹配,因此 shell 不会展开模式。
然而,养成依赖这种行为的习惯是危险的,因为在一般情况下,人们可能并不总是知道或记住当前目录中可用或将可用的名称。某些 shell 还具有用于将不匹配的模式扩展为空字符串的 shell 选项,nullglob
例如bash
.如果模式未加引号,则设置此 shell 选项将使命令失败。
简单地引用模式比依赖环境更安全。