这是输出。
echo *.*
file1.txt file2.txt file3.txt
echo * .*
file1.txt file2.txt file3.txt . ..
如果第二个命令在句点之前没有空格字符,为什么会包含这些文件?感谢您的帮助非常的爱!
答案1
这是两个独立的球体。第一个*
匹配除隐藏文件之外的所有内容,以便打印出file1.txt
、file2.txt
和file3.txt
。第二个,.*
仅匹配隐藏文件和目录:名称以 开头的文件和目录.
,因此打印出.
和..
。
如果您只想打印带有空格后跟句点的文件/目录名称,则需要转义空格,以便它不会被视为分隔符:
$ ls
file1.txt 'file2 .txt'
$ echo *\ .*
file2 .txt
最后,我可能应该提到并不*.*
意味着“匹配所有内容”。与 Windows 系统不同,*nix 系统不需要文件名扩展名(除了极少数例外,扩展名完全是可选的和任意的)。在 *nix 系统上,*.*
glob 将仅打印.
名称中带有 a 的文件名:
$ ls
file file1.txt 'file2 .txt'
$ echo *.*
file1.txt file2 .txt
要打印所有文件,请使用单个*
:
$ echo *
file file1.txt file2 .txt
答案2
命令的参数用空格分隔,除非它们被引号括起来。
echo *.*
匹配包含“任何字符”( *
)、后跟一个点 ( .
) 和“任何字符”( *
) 的文件名。
echo * .*
第一个模式将文件名与“任何字符”( *
) 相匹配。第二个模式 (" .*
") 匹配以点 ( .
) 开头、后跟“任何字符”( *
) 的文件名。这些“点文件”与 不匹配*
,这就是为什么它们通常被称为“隐藏”文件。
您看到的两个条目(“ .
”和“ ..
”)是当前目录和父目录所需的链接。
处理包含空格和其他“有趣”字符的文件名(文件名中仅禁止使用NUL 0x00
斜杠/
)很复杂(读取man find xargs
),如果可能,应避免。
在文件名中引用空格有多种方法,每种方法的细节略有不同:
echo *\ .*
echo *" ."*