Bash 通配符不扩展

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 有一个nullglobshell 选项,可以将不匹配的 shell 通配符扩展为空字符串。在bash此启用使用shopt -s nullglob.