Gooberpatrol66 Asked: 2018-06-19 22:35:28 +0800 CST2018-06-19 22:35:28 +0800 CST 2018-06-19 22:35:28 +0800 CST Bash通配符不扩展 772 我正在尝试为目录中的每个文件创建一个目录。 mkdir * 返回文件存在。所以我尝试 mkdir *.d 它创建了一个名为“*.d”的目录。如何强制通配符扩展? bash wildcards 3 个回答 Voted Best Answer Kusalananda 2018-06-19T22:42:09+08:002018-06-19T22:42:09+08:00 通配符始终扩展为现有名称。 您的命令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 或者,对于喜欢“单线”的人来说, for n in ./*; do [ -f "$n" ] && mkdir "$n.d"; done 在bash,你也可以做 names=( ./* ) mkdir "${names[@]/%/.d}" 但这不会检查 glob 扩展为的内容是常规文件还是其他文件。 上述命令中的首字母./是为了防止文件名中包含初始破折号 ( -) 的文件名。破折号及其后面的字符将被解释为mkdir. 1 一些 shell 有一个nullglobshell 选项,可以将不匹配的 shell 通配符扩展为空字符串。在bash此使用shopt -s nullglob. Stéphane Chazelas 2018-06-19T23:12:37+08:002018-06-19T23:12:37+08:00 *.d扩展为名称以 . 结尾的文件.d。 使用zsh,您可以执行以下操作: files=(*) mkdir -- $^files.d 或者使用匿名函数: () { mkdir -- $^argv.d; } * e或者通过glob 限定符添加后缀: mkdir -- *(e{REPLY+=.d}) 或:s应用于 glob 的历史修饰符(用histsubstpatternfor%表示end): set -o histsubstpattern mkdir -- *(:s/%/.d) ^-/通过添加glob 限定符,您可能还不想对已经是目录或目录符号链接的文件执行此操作: files=(*(^-/)) mkdir -- $^files.d (请注意,zsh它没有其他类似 Bourne 的 shell 的错误功能,其中不匹配的模式按原样传递,因此如果当前目录中没有匹配的文件,则mkdir *.d不会创建目录,它将中止命令而是出现错误)*.d*.d pawel7318 2018-06-20T06:15:12+08:002018-06-20T06:15:12+08:00 而不是for foo in bar; do baz; done解决方案,我会建议: find . -maxdepth 1 -type f -print0|xargs -0 -I file mkdir file.d
通配符始终扩展为现有名称。
您的命令
mkdir *
失败,因为*
扩展为的名称已经存在。您的命令
mkdir *.d
“失败”,因为*.d
与任何现有名称都不匹配。因此,该模式在默认情况下保持未扩展1并创建一个名为的目录*.d
。您可以使用 删除它rmdir '*.d'
。为当前目录中的每个常规文件创建一个目录,以便新目录与文件具有相同的名称,但带有
.d
后缀:或者,对于喜欢“单线”的人来说,
在
bash
,你也可以做但这不会检查 glob 扩展为的内容是常规文件还是其他文件。
上述命令中的首字母
./
是为了防止文件名中包含初始破折号 (-
) 的文件名。破折号及其后面的字符将被解释为mkdir
.1 一些 shell 有一个
nullglob
shell 选项,可以将不匹配的 shell 通配符扩展为空字符串。在bash
此使用shopt -s nullglob
.*.d
扩展为名称以 . 结尾的文件.d
。使用
zsh
,您可以执行以下操作:或者使用匿名函数:
e
或者通过glob 限定符添加后缀:或
:s
应用于 glob 的历史修饰符(用histsubstpattern
for%
表示end):^-/
通过添加glob 限定符,您可能还不想对已经是目录或目录符号链接的文件执行此操作:(请注意,
zsh
它没有其他类似 Bourne 的 shell 的错误功能,其中不匹配的模式按原样传递,因此如果当前目录中没有匹配的文件,则mkdir *.d
不会创建目录,它将中止命令而是出现错误)*.d
*.d
而不是
for foo in bar; do baz; done
解决方案,我会建议:find . -maxdepth 1 -type f -print0|xargs -0 -I file mkdir file.d