我经常发现,在使用命令行时,我需要复制最后一个命令输出中出现的路径。例如,我可能会find . | grep
这样使用:
[user@localhost /tmp]$ find . | grep B
./directoryAB
./directoryBA
./directoryBB
./directoryBC
./directoryCB
此时我需要拿起鼠标,复制我想要的路径,然后输入cd
,然后粘贴。但如果我可以循环遍历输出中的路径并复制我想要的路径,那就太棒了,只需使用键盘即可。有什么可以帮助我做到这一点吗?
我使用 zsh 和 iTerm2,仅供参考。
答案1
使用与生成输出的程序直接一起使用的工具可以更轻松地实现这一点,而不是尝试从已打印的内容中将其抓回。
有一些工具可以显示交互式的“选择项目”或“选择文件”提示,并旨在将其作为命令反馈到 shell 中。fzf
和broot
就是两个例子。
fzf
可以通过 stdin 接受任何输入并让您以交互方式对其进行过滤,例如:
cd "$(find -type d | fzf)"
这可以包装在 shell 函数中,或用作增强的 Tab 完成功能(fzf 中包含了此功能的 Bash 代码),甚至可以绑定到自定义键盘快捷键,例如 Alt+D 通过 fzf 选择目录并将其插入到光标位置(我的别名.sh有一个针对 Bash 的示例,但对于 Zsh 来说则需要采取非常不同的做法)。
broot
另一方面,它具体是一个文件树浏览器,但也设计为通过 shell 函数包装器来使用。
broot --print-shell-function >> ~/.bashrc
运行新创建的br
函数将打开一个文件浏览器,在其中使用 Alt-Enter 选择一个文件夹将导致父 shell 进入cd
选定的位置。
答案2
这是一个解决方案。首先,将这些别名添加到您的.bashrc
、.zshrc
或等效配置文件中:
alias l1='fc -e - | sed -n 1p'
alias l2='fc -e - | sed -n 2p'
alias l3='fc -e - | sed -n 3p'
alias l4='fc -e - | sed -n 4p'
alias l5='fc -e - | sed -n 5p'
alias l6='fc -e - | sed -n 6p'
alias l7='fc -e - | sed -n 7p'
alias l8='fc -e - | sed -n 8p'
alias l9='fc -e - | sed -n 9p'
alias c1='fc -e - | sed -n 1p | tr -d \\n | pbcopy'
alias c2='fc -e - | sed -n 2p | tr -d \\n | pbcopy'
alias c3='fc -e - | sed -n 3p | tr -d \\n | pbcopy'
alias c4='fc -e - | sed -n 4p | tr -d \\n | pbcopy'
alias c5='fc -e - | sed -n 5p | tr -d \\n | pbcopy'
alias c6='fc -e - | sed -n 6p | tr -d \\n | pbcopy'
alias c7='fc -e - | sed -n 7p | tr -d \\n | pbcopy'
alias c8='fc -e - | sed -n 8p | tr -d \\n | pbcopy'
alias c9='fc -e - | sed -n 9p | tr -d \\n | pbcopy'
alias L='fc -e - | nl -b a -w2 -s" "'
然后,在运行命令后,您可以键入l1
以查看输出的第一行并c1
复制它。键入L
以查看行号。(我使用别名,因为fc -e -
它在脚本中不起作用。我添加了别名,tr -d \\n
以便不会将换行符添加到剪贴板。)
请注意,这些别名重新运行命令。
以下解决方案(Miiyr 在上面的评论中提到)可能对某些人更有效:使用键盘在 iTerm 中选择文本
稍后添加:
您还可以使用这样的循环:
for i in $(seq 1 500); do
fc="fc -e - | sed -n ${i}p"
eval "alias l$i='$fc'"
eval "alias c$i='$fc | tr -d \\n | pbcopy'"
done
答案3
这是做的工作:https://facebook.github.io/PathPicker/. 在 Mac 上您可以执行以下操作:brew install fpp
。
例如你可以这样做:
git status
fpp
使用up
和down
(或j
和k
)直到找到要编辑的路径,然后按回车键。
ps 如果你将 tmux 与 oh-my-tmux 一起使用(https://github.com/gpakosz/.tmux)prefix F
是 的快捷方式fpp
。