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

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

我有这样的事情:

% ls -1dF /tmp/foo/*
/tmp/foo/000f9e956feab3ee4625aebb65ae7bae9533cdbc/
/tmp/foo/002e34c2218f2c86fefd2876f0e5c2559c5fb3c4/
/tmp/foo/00b483576791bab751e6cb7ee0a7143af43a8069/
.
.
.
/tmp/foo/fedd0f7b545e7ae9600142656756456bc16874d3/
/tmp/foo/ff51ac87609012137cfcb02f36624f81cdc10788/
/tmp/foo/ff8b983a7411395344cad64182cb17e7cdefa55e/

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

如果我尝试这样做

% mkdir -p /tmp/foo/*/bar

...我收到错误

zsh: no matches found: /tmp/foo/*/bar

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

我知道我可以用 for 循环解决原始问题,但我很好奇是否zsh支持某种形式的参数扩展,该扩展将为单次调用生成所需的参数mkdir -p。 IOW,参数扩展相当于“附加/bar到扩展生成的每个前缀/tmp/foo/*”,结果是

% mkdir -p /tmp/foo/000f9e956feab3ee4625aebb65ae7bae9533cdbc/bar ... /tmp/foo/ff8b983a7411395344cad64182cb17e7cdefa55e/bar

答案1

setopt histsubstpattern extendedglob
mkdir -p /tmp/foo/*(#q/:s_%_/bar_)

这是扩展的通配符有一个quiet全球标志使用一个全局限定符仅匹配目录和修饰语执行s替换(使用%仅在历史替代模式模式),将字符串附加到每个单词。

man zshexpn

答案2

当然 - 使用循环

for n in /tmp/foo/*; do mkdir "$n/bar";done

glob 用于扩展列表现存的项目,而不是尚未创建的事物。

答案3

如果目录是数组,可以使用${^...}扩展的形式。

a=(/tmp/foo/*/)
mkdir -p ${^a}bar

答案4

@loa_in_ 拥有大部分,但管道find输出往往是一种失礼。

find /tmp/foo -maxdepth 1 -mindepth 1 -type d -exec mkdir {}/bar \;

相关内容