如何用更少的击键输入多个文件名

如何用更少的击键输入多个文件名

如果我想使用 imagemagick 将 a 转换pdfpng图像,我会执行以下操作:

convert -trim -density 400 this_is_a_very_long_filename_of_my_pdf_file.pdf this_is_a_very_long_filename_of_my_pdf_file.png

由于某些原因,pdf 文件通常有一个很长的文件名,我希望该png文件除了扩展名之外具有相同的名称。

通常我this_is_a_very_long_filename_of_my_pdf_file.pdf通过选项卡选择两次,zsh-menu然后pdfpng第二个参数更改为手动。

但是有没有更快的方法来做到这一点?

答案1

您可以使用大括号扩展:

convert -trim -density 400 this_is_a_very_long_filename_of_my_pdf_file.{pdf,png}

答案2

对 mogrify 的调用将创建一个新的 png 文件,而不是覆盖 pdf - 希望如此;)

mogrify -trim density 400 -format png th*.pdf

对于 th*.pdf,使用适当的字符数来选择正确的文件或更好的制表符补全,直到获得全名。

通过这种方式,您可以为整个命令创建一个别名,直到 png 参数。

答案3

如果您始终使用相同的命令,但有细微的变化(例如文件名),则可以编写一个函数:

pdf2png() { convert -trim -density 400 "$1" "$1:r.png" }

(此函数特定于zsh),对于您要转换的每个文件 your_file.pdf:

pdf2png your_file.pdf

注1:您可以为其他shell编写相同类型的函数,但这有点复杂。

注 2:对于,仅当设置了该选项(这不是默认设置)zsh时,引号才有用。SH_WORD_SPLIT

答案4

您还可以使用历史扩展引用当前命令行上的单词:

convert -trim -density 400 this_is_a_very_long_filename_of_my_pdf_file.pdf !#:$:r.png
  • 事件指示符 !#指到目前为止输入的命令行
  • 字指示符 $表示最后一个单词(扩展之前)
  • 修饰符 r删除文件扩展名。这也标志着文本的结束,当历史扩展发生时,文本将被替换。
  • .png是新的扩展。这不属于扩展本身。

运行此行时,!#:$:r将被替换为 pdf 文件的名称减去扩展名,从而根据问题创建命令:

convert -trim -density 400 this_is_a_very_long_filename_of_my_pdf_file.pdf this_is_a_very_long_filename_of_my_pdf_file.png

然后直接执行这一行。

如果你想在历史扩展后检查命令,在执行之前,使用

setopt histverify

这会将扩展的行重新加载到编辑缓冲区中,而不是执行它。

注意:与任何其他扩展不同,历史扩展是在命令保存到历史记录之前执行的。因此echo !#将显示为echo echo而不是echo !#您的$HISTFILE.

相关内容