Goo*_*l66 4 bash wildcards mkdir
我正在尝试为目录中的每个文件创建一个目录。
mkdir *
Run Code Online (Sandbox Code Playgroud)
返回文件存在。所以我尝试
mkdir *.d
Run Code Online (Sandbox Code Playgroud)
它创建了一个名为“*.d”的目录。如何强制通配符扩展?
Kus*_*nda 20
通配符始终扩展到现有名称。
您的命令mkdir *
失败,因为*
扩展到的名称已存在。
您的命令mkdir *.d
“失败”,因为*.d
与任何现有名称都不匹配。因此,默认情况下该模式未展开1并*.d
创建一个名为的目录。你可以用 删除它rmdir '*.d'
。
为当前目录中的每个常规文件创建一个目录,以便新目录与文件同名,但带有.d
后缀:
for name in ./*; do
if [ -f "$name" ]; then
# this is a regular file (or a symlink to one), create directory
mkdir "$name.d"
fi
done
Run Code Online (Sandbox Code Playgroud)
或者,对于喜欢“one-liners”的人来说,
for n in ./*; do [ -f "$n" ] && mkdir "$n.d"; done
Run Code Online (Sandbox Code Playgroud)
在bash
,你也可以做
names=( ./* )
mkdir "${names[@]/%/.d}"
Run Code Online (Sandbox Code Playgroud)
但这不会检查 glob 扩展到的内容是常规文件还是其他内容。
./
上述命令中的首字母是为了防止文件名中包含首字母短划线 ( -
) 的文件名。否则,破折号及其后的字符将被解释为 的选项mkdir
。
1 某些 shell 有一个nullglob
shell 选项,可以将不匹配的 shell 通配符扩展为空字符串。在bash
此启用使用shopt -s nullglob
.