如何在所有子目录中创建目录?

Ani*_*esh 39 bash directory wildcards

假设我有一个这样的目录结构:

$ [~/练习] ls
A B C D/

现在我想tmp1在所有子目录中创建一个目录practice,我这样做:

$ [~/practice] mkdir */tmp1
mkdir: 无法创建目录 `*/tmp1': 没有那个文件或目录

然后我尝试-p切换,最终得到一个以子目录命名*的目录tmp1

$ [~/practice] mkdir -p */tmp1

$ [~/练习] ls
*/ A B C D/

我知道-pswitch的用途是创建多个不存在的目录。我只是觉得它可能会有所帮助。

如何tmp1一次在所有子目录中创建?

如果可以做到这一点,我如何延长它来创建\tmp1\tmp2\tmp3\a\b\c在一次?

编辑:我错过提的是,目录不必是简单而有序,像abc等等,并且要创建的目录不一定喜欢tmp1tmp2

$ [~/练习] ls
狗/猫/老鼠/

在他们中,我想有类似的东西

$ [~/练习] ls *
狗:
红蓝/

猫:
红蓝/

鼠:
红蓝/

Gil*_*not 53

使用球体

for dir in */; do mkdir -- "$dir/tmp1"; done
Run Code Online (Sandbox Code Playgroud)

笔记

  • 我只处理 dirs(包括指向 dirs 的符号链接),并使用*/作为 glob的小技巧
  • 如果你想一次创建多个子目录:

    for dir in */; do mkdir -- "$dir"/{tmp1,foo,bar,qux}; done


Chr*_*her 11

[...] 我如何扩展它以同时在 \a、\b 和 \c 中创建 \tmp1、\tmp2、\tmp3?

 mkdir {a,b,c}/tmp{1,2,3}
Run Code Online (Sandbox Code Playgroud)


koj*_*iro 10

使用 GNU 或 BSD* 查找:

find -mindepth 1 -maxdepth 1 -type d -exec mkdir {}/newdir \;
Run Code Online (Sandbox Code Playgroud)

或使用参数扩展:

dirs=(*/)
mkdir -- "${dirs[@]/%/newdir}"
Run Code Online (Sandbox Code Playgroud)

*包括 OS X

  • 使用标准查找语法:`find 。-姓名 。-o -prune -type d -exec sh -c 'exec mkdir "$1/newdir"' sh {} \;` (2认同)

Sté*_*las 6

离题,因为你提到了bash,但为了记录,使用 zsh,你会这样做:

dirs=(*(/))
mkdir -- $^dirs/tmp1
Run Code Online (Sandbox Code Playgroud)

$^var 打开 为数组的扩展类似大括号的扩展。它让人想起rc^运算符和 in rc(或其衍生物es),你会这样写:

dirs=(*/)
mkdir -- $dirs^tmp1
Run Code Online (Sandbox Code Playgroud)

但是请注意(同样适用于此处给出的 bash 解决方案)在 rc 解决方案中 dirs也将包含指向目录的符号链接。在 zsh 解决方案中,如果要包含目录的符号链接,请更改*(/)*(-/)


Gil*_*il' 5

可移植地,循环父目录:

for d in */; do mkdir "$d/red" "$d/blue"; done
Run Code Online (Sandbox Code Playgroud)

如果您可能有名称以 开头的目录,请--在后面添加。mkdir-

e 在 zsh 中,您可以使用glob 限定符在单个命令中完成此操作:

mkdir *(/e\''REPLY=($REPLY/{red,blue})'\')
Run Code Online (Sandbox Code Playgroud)

但将其作为两个命令输入会更快:

d=(*(/)); mkdir $^d/{red,blue}
Run Code Online (Sandbox Code Playgroud)