对每个匹配一次执行命令的通配符

Soc*_*owi 5 bash shell zsh wildcard

备用标题:如何循环而不循环或使用xargs。

最近,由于具有许多功能,我切换到zsh。我很好奇:是否有一种功能可以扩展通配符,以便每个匹配项只执行一次命令,而不是所有匹配项一次执行。

该命令ebook-convert input_file output_file [options]仅接受一个输入文件。当我要转换多个文件时,我必须多次手动执行命令或使用循环,例如:

for i in *.epub; do 
    ebook-convert "$i" .mobi
done
Run Code Online (Sandbox Code Playgroud)

我想要的是一个通配符,其功能类似于循环,以便我可以保存一些击键。让说通配符?。命令

ebook-convert ?.epub .mobi
Run Code Online (Sandbox Code Playgroud)

应该扩展到

ebook-convert 1stMatch.epub .mobi
ebook-convert 2ndMatch.epub .mobi
ebook-convert 3rdMatch.epub .mobi
...
Run Code Online (Sandbox Code Playgroud)

仍然对其他答案感兴趣

我接受了一个对我有用的答案(感谢Grisha Levit)。但是,如果您知道其他具有此功能的shell,比编写循环短的替代命令,甚至是用通配符扩展zsh的方法,您的答案都会受到欢迎。

hch*_*baw 5

你可以在 zsh 中结账zargs

\n\n
\n

此函数与 GNU xargs 具有类似的用途。它不是从标准输入读取参数行,而是从命令行获取它们

\n\n

zshcontrib(1): OTHER FUNCTIONS, zargs

\n
\n\n

所以,我们可以写:

\n\n
autoload -Uz zargs\nzargs -I\xe2\x81\x82 -- *.epub -- ebook-convert \xe2\x81\x82 .mobi\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

PS:zmv如果您需要捕获模式的某些部分来构建命令,您会发现它很方便。

\n


Gri*_*vit 4

\n

这样我就可以节省一些击键次数

\n
\n\n

好的,假设您输入了

\n\n
ebook-convert *.epub .mobi\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x80\xa6 现在你意识到这不起作用 \xe2\x80\x94 你需要编写一个循环。你通常会做什么?大概是这样的:

\n\n
    \n
  • 添加; done到行尾
  • \n
  • 点击CtrlA以转到该行的开头
  • \n
  • 输入for i in\xe2\x80\xa6
  • \n
  • 等\xe2\x80\xa6
  • \n
\n\n

这看起来很适合 readline 键盘宏:

\n\n

让我们用 readline命令和常规按键来写出这些步骤:

\n\n
end-of-line                     #(从末尾开始以保持一致性)\n; done # 输入循环结束语句\n character-search-backward * # 返回 glob 所在位置\n shell-backward-word             # (如果 glob 位于单词中间)\n shell-kill -word                 # 用 glob“剪切”单词\n"$i" # 键入循环变量\n行              # 回到行首\nfor i in # 键入循环开头\n yank                            # 用 glob“粘贴”单词\n; do # 输入循环结束的开头\n
\n\n

创建绑定:

\n\n

对于上面使用的任何没有键绑定的 readline 命令,我们需要创建一个。我们还需要为我们正在创建的新宏创建绑定。

\n\n

除非您已经完成了大量的 readline 自定义,否则运行以下命令将为当前 shell 设置绑定。这使用默认绑定,如\\C-e\xe2\x9e\x99end-of-line

\n\n
bind \'"\\eB": shell-backward-word\'\nbind \'"\\eD": shell-kill-word\'\n\nbind \'"\\C-i": "\\C-e; done\\e\\C-]*\\eB\\eD \\"$i\\"\\C-afor i in\\C-y; do "\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

绑定也可以保存到inputrc文件中以实现持久性。

\n\n

使用快捷方式:

\n\n

设置完成后:

\n\n
    \n
  1. 输入类似的内容

    \n\n
    电子书转换 *.epub .mobi
  2. \n
  3. CtrlI
  4. \n
  5. 该线将转变为

    \n\n
    对于 *.epub 中的 i;执行电子书转换“$i”.mobi;完毕
  6. \n
\n\n

如果你想立即运行该命令,你可以修改宏以附加 a\\C-j作为最后一次按键,这将触发accept-line(与点击相同)Return)。

\n