如何使用Bash为每个子目录创建文件名

时间:2017-01-23 21:44:24

标签: bash

我有一个像这样的文件夹结构:

.
+-- dir
|   +-- subdir1
|   +-- subdir2
|   +-- subdir3
|   +-- subdir4

我想使用Bash在每个index.html内创建一个subdir文件:

.
+-- dir
|   +-- subdir1
|       +-- index.html
|   +-- subdir2
|       +-- index.html
|   +-- subdir3
|       +-- index.html
|   +-- subdir4
|       +-- index.html

我可以使用以下命令列出所有子目录:

 .
 $ ls dir/*/

使用touch创建一个文件,然后我认为正确的命令是:

.
$ touch dir/*/index.html

结果:touch: cannot touch 'dir/*/index.html': No such file or directory

如何使用Bash为每个子目录创建文件名?

1 个答案:

答案 0 :(得分:3)

为什么touch dir/*/index.html无效

Globs仅将扩展到实际存在的内容,如果不存在匹配项,则将其扩展到glob表达式本身,并且shell选项都是默认配置。 (可以使用shopt -s nullglobshopt -s failglob来配置此方案,以便在bash中不生成任何参数或出现错误情况。

因此,如果您有dir/subdir1/index.html,但dir/subdir2/但其中没有index.html,则dir/*/index.html将展开为仅包含dir/subdir1/index.html,但不包含任何引用至subdir2

如何解决

全球化存在的东西 - 目录 - 并坚持不做自己的事情:

for d in dir/*/; do touch -- "$d/index.html"; done

如果您的某个目录的名称以短划线开头,则需要--:您不希望-dirname被视为{{1}的选项}}; touch表示所有未来的参数都被视为位置,防止出现这种情况。