使用参数扩展为 `mkdir -p` 生成参数列表

kjo*_*kjo 10 zsh

我有这样的事情:

% ls -1dF /tmp/foo/*
/tmp/foo/000f9e956feab3ee4625aebb65ae7bae9533cdbc/
/tmp/foo/002e34c2218f2c86fefd2876f0e5c2559c5fb3c4/
/tmp/foo/00b483576791bab751e6cb7ee0a7143af43a8069/
.
.
.
/tmp/foo/fedd0f7b545e7ae9600142656756456bc16874d3/
/tmp/foo/ff51ac87609012137cfcb02f36624f81cdc10788/
/tmp/foo/ff8b983a7411395344cad64182cb17e7cdefa55e/
Run Code Online (Sandbox Code Playgroud)

我想bar在下的每个子目录下创建一个目录foo

如果我尝试这样做

% mkdir -p /tmp/foo/*/bar
Run Code Online (Sandbox Code Playgroud)

...我得到了错误

zsh: no matches found: /tmp/foo/*/bar
Run Code Online (Sandbox Code Playgroud)

(事后看来,我可以理解错误的原因。)

我知道我可以用 for 循环解决原始问题,但我很想知道是否zsh支持某种形式的参数扩展,它会为mkdir -p. IOW,相当于“附加/bar到每个扩展生成的前缀”的参数扩展/tmp/foo/*,导致

% mkdir -p /tmp/foo/000f9e956feab3ee4625aebb65ae7bae9533cdbc/bar ... /tmp/foo/ff8b983a7411395344cad64182cb17e7cdefa55e/bar
Run Code Online (Sandbox Code Playgroud)

Jde*_*eBP 13

setopt histsubstpattern extendedglob
mkdir -p /tmp/foo/*(#q/:s_%_/bar_)
Run Code Online (Sandbox Code Playgroud)

这是扩展的 globbing,它有一个quiet glob 标志,它使用glob 限定符只匹配目录和一个修饰符来执行s替换(使用%仅在历史替换模式模式下可用的模式字符),将字符串附加到每个单词。

man zshexpn
Run Code Online (Sandbox Code Playgroud)


Tho*_*key 5

当然 - 使用循环

for n in /tmp/foo/*; do mkdir "$n/bar";done
Run Code Online (Sandbox Code Playgroud)

globs 用于扩展现有项目的列表,而不是尚未创建的项目。

  • 如果`zsh` 可以用单一语法扩展globs 并附加文本,这并不能回答——但我确实认为这可能是做你想做的事情的唯一方法,@kjo。 (2认同)