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在一次?
编辑:我错过提的是,目录不必是简单而有序,像a,b,c等等,并且要创建的目录不一定喜欢tmp1,tmp2。
$ [~/练习] ls 狗/猫/老鼠/
在他们中,我想有类似的东西
$ [~/练习] ls * 狗: 红蓝/ 猫: 红蓝/ 鼠: 红蓝/
Gil*_*not 53
使用球体:
for dir in */; do mkdir -- "$dir/tmp1"; done
Run Code Online (Sandbox Code Playgroud)
*/作为 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
离题,因为你提到了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 解决方案中,如果要包含目录的符号链接,请更改*(/)为*(-/)。
可移植地,循环父目录:
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)