是否可以向 shell glob 扩展添加“前缀”?我的用例如下,我有一个程序需要重复选项标志来传递多个文件作为输入:
$ ls
foo.txt bar.txt baz.txt
$ ./some-script.sh -a foo.txt -a bar.txt -a baz.txt
我希望能够使用某种扩展来添加'-a '
到 的每个项目中*txt
。这可能吗?用 zsh?bash?
答案1
您可以在嘚使用所谓的glob 限定符(参见章节Glob 限定符在里面韋什麼意思手册页):
./some-script.sh *.txt(P:-a:)
对于解释,我引用了手册:
磷 细绳字符串将作为单独的单词添加到每个 glob 匹配项的前面。字符串的分隔方式与上述 e glob 限定符的参数相同。限定符可以重复;单词将单独添加到前面,以便生成的命令行包含的单词的顺序与 glob 限定符列表中给出的顺序相同。
一个典型的用法是在所有出现的文件名前添加一个选项;例如,模式
*(P:-f:)
生成命令行参数-f file1 -f file2 ...
如果修饰符 ^ 处于活动状态,则字符串将被附加而不是添加到前面。添加和附加是独立完成的,因此两者都可以在同一个 glob 表达式中使用;例如,通过
编写*(P:foo:^P:bar:^P:baz:)
生成命令行参数的foo baz file1 bar ...
为了谨慎起见,请先检查
$ print ./some-script.sh *.txt(P:-a:)
./some-script.sh -a foo.txt -a bar.txt -a baz.txt
如果您获得了期望的结果。
答案2
如果我们不希望前缀和文件名之间有任何空格,或者我们还想要后缀或任何其他字符串操作,我正在为 zsh 扩展@mpy 答案:
print -l *.txt(e:'REPLY=PFX_${REPLY}_SFX':)
这使:
PFX_foo.txt_SFX
PFX_bar.txt_SFX
PFX_baz.txt_SFX
请注意,单引号很重要,以避免 $REPLY 过早扩展。
例如(即使dd
只处理最后一个if=
参数):
dd *.img(e:'REPLY=if=$REPLY':)
http://zsh.sourceforge.net/Doc/Release/Expansion.html#index-reply_002c-use-of