通配符 `*` 无法匹配某些字符串?

通配符 `*` 无法匹配某些字符串?
ls  -al  .functions*
-rw-r--r-- 1 root root 471040 Mar  2 10:01 .functions.php.swo
-rw-r--r-- 1 root root 438272 Mar  2 09:57 .functions.php.swp

*可以匹配.php.swo.php.swp
为什么*不能匹配.functions.php

ls  -al  *.swo
ls: cannot access '*.swo': No such file or directory
ls  -al  *swo
ls: cannot access '*swo': No such file or directory

答案1

默认情况下,以点开头的文件在文件列表中是隐藏的。匹配此类文件的最简单方法是在表达式的开头放置一个点。但是,这只会匹配以 开头的文件.

ls  -al  .*.swo

dotglob另一种方法是在运行命令之前设置,然后以开头的文件.将被包含在内。

shopt -s dotglob

将其添加到您的~/.bashrc默认设置中。

注意设置dotglob可能会导致意想不到的结果使用 bash shell 时,因为使用 时将同时出现.(当前目录) 和(父目录) 。使用set,..*dotglob绝不尝试使用rm -R *

答案2

作为扩大对于 Shaido 的回答,我想解释一下为什么该-a选项在这里不起作用:

ls命令确实不是处理通配符。命令行解释器执行以下步骤:

如果您输入命令行“ ”,命令行解释器将首先用匹配的文件列表mycommand *.c替换通配符字符串“ ”,然后执行生成的命令行:*.c

mycommand a.c file.c test.c

命令行解释器对所有命令的工作方式都相同,因此它无法知道该命令的-a含义是“包括隐藏文件” ls(而-a对于其他命令则具有完全不同的含义)...

相关内容