Soc*_*owi 5 bash shell zsh wildcard
最近,由于具有许多功能,我切换到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的方法,您的答案都会受到欢迎。
你可以在 zsh 中结账zargs。
\n\n\n此函数与 GNU xargs 具有类似的用途。它不是从标准输入读取参数行,而是从命令行获取它们
\n\n \n
所以,我们可以写:
\n\nautoload -Uz zargs\nzargs -I\xe2\x81\x82 -- *.epub -- ebook-convert \xe2\x81\x82 .mobi\nRun Code Online (Sandbox Code Playgroud)\n\nPS:zmv如果您需要捕获模式的某些部分来构建命令,您会发现它很方便。
\n\n\n这样我就可以节省一些击键次数
\n
好的,假设您输入了
\n\nebook-convert *.epub .mobi\nRun Code Online (Sandbox Code Playgroud)\n\n\xe2\x80\xa6 现在你意识到这不起作用 \xe2\x80\x94 你需要编写一个循环。你通常会做什么?大概是这样的:
\n\n; done到行尾for i in\xe2\x80\xa6让我们用 readline命令和常规按键来写出这些步骤:
\n\nend-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
对于上面使用的任何没有键绑定的 readline 命令,我们需要创建一个。我们还需要为我们正在创建的新宏创建绑定。
\n\n除非您已经完成了大量的 readline 自定义,否则运行以下命令将为当前 shell 设置绑定。这使用默认绑定,如\\C-e\xe2\x9e\x99end-of-line。
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 "\'\nRun Code Online (Sandbox Code Playgroud)\n\n绑定也可以保存到inputrc文件中以实现持久性。
设置完成后:
\n\n输入类似的内容
\n\n电子书转换 *.epub .mobi
该线将转变为
\n\n对于 *.epub 中的 i;执行电子书转换“$i”.mobi;完毕
如果你想立即运行该命令,你可以修改宏以附加 a\\C-j作为最后一次按键,这将触发accept-line(与点击相同)Return)。