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


10

我有这样的事情:

% 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

Answers:


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

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

man zshexpn

哇,我印象深刻。我什至在您指定的手册页中找到了所有内容。
通配符

1
请注意,指定了Original Poster mkdir -p,这与您的命令中的一些命令(如果其中一些目录已经具有bar子目录)不会引发错误的效果略有不同。小点,但在这里值得注意。:)
通配符

1
另一种方法是使用数组扩展${^spec},并将bar/tmp/foo/*(/)扩展为扩展到的每个元素: set -- /tmp/foo/*(/)然后mkdir -p -- "${^@}/bar"
don_crissti

5

当然-使用循环

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

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


抱歉,我的问题不清楚。我会澄清。
kjo

2
如果zsh可以扩展glob并使用单一语法附加文本,这并不能解决问题,但是我确实认为@kjo可能是唯一的方法。
通配符

4

如果目录位于数组中,则可以使用${^...}扩展形式。

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

0

您可以使用findxargs这样做:

find /tmp/foo -maxdepth 1 -mindepth 1 -type d | xargs -i echo mkdir -p {}/bar

它分别使用-maxdepth 1-mindepth 1阻止bar在目标的子目录中以及/tmp/foo本身的创建。type d使它仅考虑目录。

您必须删除echo才能执行实际操作,否则echo只会打印出要执行的行。您也可以将其替代$()以执行它。

手册说xargs -i是过时了,但我没有发现其他同样方便的选择,所以还是应该有些年头的工作...你可以代替-i使用-I'{}',以达到最新的这一点。


这个答案和下一个答案对我来说看起来不错。有人可以解释为什么他们应该被否决吗?否决票可以,但是如果没有给出原因,我们如何学习?

这是一个可行的替代方案,除了OP要求什么之外什么也不做。甘拜下风。
loa_in_

我认为答案一定对他们有不好的回答是一种偏见,因此对我的声誉造成损害。
loa_in_

我不喜欢无法解释的不赞成票,但我没有看到任何这种偏见。通常,“错误的”答案(我理解的答案)实际上是错误的。

0

@loa_in_占了大部分,但是管道find输出趋于虚假。

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

我只是使用xargs没有-exec替代品的其他工具,所以我使用我的方法,因为它可以同等地适用于所有工具。
loa_in_
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.