Emm*_*maV 3 shell filenames quoting wildcards
'4800483343' 是一个目录,'file1' & 'file2' 是其中的两个文件。
为什么会发生以下情况?
$ ls 4800483343
file1 file2
$ md5sum 4800483343/*
36468e77d55ee160477dc9772a99be4b 4800483343/file1
29b098f7d374d080eb006140fb01bbfe 4800483343/file2
$ mv 4800483343 4800[48]3343
$ md5sum 4800[48]3343/*
md5sum: 4800[48]3343/*: No such file or directory
$ md5sum '4800[48]3343'/*
36468e77d55ee160477dc9772a99be4b 4800[48]3343/file1
29b098f7d374d080eb006140fb01bbfe 4800[48]3343/file2
Run Code Online (Sandbox Code Playgroud)
还有哪些字符会导致这种情况?
为什么方括号会阻止外壳扩展
方括号不能阻止 shell 扩展,但引号可以。
我怀疑你实际运行的命令如下
这对以下文件运行 md5sum dir/
:
$ md5sum d[i]r/*
02fdd7309cef4d392383569bffabf24c dir/file1
db69ce7c59b11f752c33d70813ab5df6 dir/file2
Run Code Online (Sandbox Code Playgroud)
这移动dir
到d[i]r
防止方括号扩展的引号:
$ mv dir 'd[i]r'
Run Code Online (Sandbox Code Playgroud)
这将查找dir
不再存在的目录:
$ md5sum d[i]r/*
d[i]r/*: No such file or directory
Run Code Online (Sandbox Code Playgroud)
由于引号,以下内容在名为 的新目录中查找d[i]r
:
$ md5sum 'd[i]r'/*
02fdd7309cef4d392383569bffabf24c d[i]r/file1
db69ce7c59b11f752c33d70813ab5df6 d[i]r/file2
Run Code Online (Sandbox Code Playgroud)
修改后的问题中,目录4800483343存在,运行如下命令:
mv 4800483343 4800[48]3343
Run Code Online (Sandbox Code Playgroud)
运行此命令时会发生什么取决于 glob 是否4800[48]3343
匹配任何现有目录。如果没有目录匹配,则4800[48]3343
扩展到自身4800[48]3343
并将目录4800483343
移动到目录4800[48]3343
。
最后:
该命令md5sum 4800[48]3343/*
将返回错误“没有这样的文件或目录”,因为不存在与 glob 匹配的目录4800[48]3343
。
该命令md5sum '4800[48]3343'/*
将正确找到文件,因为引号会阻止 glob 的扩展。
让我们创建两个文件:
$ touch a1b a2b
Run Code Online (Sandbox Code Playgroud)
现在,观察这些球体:
$ echo a[123]b
a1b a2b
$ echo a?b
a1b a2b
$ echo *b
a1b a2b
Run Code Online (Sandbox Code Playgroud)