当我运行find
或 时locate
,匹配的文件将填充标准输出,每行一个文件。下一步通常是我想打开这些文件之一。如果我不必输入整个文件路径,而只是可以以某种方式与搜索结果进行交互,那么这会更快、更高效。打开搜索结果中显示的文件的最快方法是什么?
类似中给出的解决方案使用“vi”打开“locate”的结果,如何“定位”多个文件并在 vim 中打开它们?, 和 如何对“locate”命令的结果采取行动?需要输入相当长的第二个命令,这没有我想要的那么快。
相反,有没有一种方法可以自动将搜索结果中的每个文件分配给数字变量名称(s1 - sn),以便打开第一个结果我只需键入vi $s1
?或者使用像这样的模糊查找器是解决这个问题的更好方法弗兹夫或者法西德?
答案1
我已经有~/.screenrc
一段时间了:
bind -c pasteline 1 eval copy 'stuff "-Y"' 'paste .'
bind -c pasteline 2 eval copy 'stuff "2-Y"' 'paste .'
bind -c pasteline 3 eval copy 'stuff "3-Y"' 'paste .'
bind -c pasteline 4 eval copy 'stuff "4-Y"' 'paste .'
bind -c pasteline 5 eval copy 'stuff "5-Y"' 'paste .'
bind -c pasteline 6 eval copy 'stuff "6-Y"' 'paste .'
bind -c pasteline 7 eval copy 'stuff "7-Y"' 'paste .'
bind -c pasteline 8 eval copy 'stuff "8-Y"' 'paste .'
bind -c pasteline 9 eval copy 'stuff "9-Y"' 'paste .'
bindkey ¬ command -c pasteline
基本上,¬1从屏幕内输入时,会在光标上方插入第一行,¬2然后插入第二行,依此类推。
在我的 中~/.Xdefaults
,我还有:
XTerm.VT100.translations: #override\
Meta <KeyPress> /: dabbrev-expand()
它可以让xterm
完成(根据Alt+/)屏幕上的内容(从光标位置向后看)。
对于zsh
,当在 内使用时screen
,您可以执行以下操作:
copy-screen() {
screen -X eval copy 'stuff "-$ H\r"' 'writebuf .lastoutput'
killring=(${(Oaf)"$(<~/.lastoutput)"})
CUTBUFFER=$killring[1]
killring[1]=()
}
zle -N copy-screen
bindkey '\ec' copy-screen
绑定Alt+C到将光标上方的行存储到剪切缓冲区和终止环(您在模式中粘贴Ctrl+Y和循环的内容)的小部件。 (上面假设是从您的主目录启动的)。Alt+Yemacs
screen
如果插入的文本需要加引号(例如因为它包含空格或其他特殊 shell 字符),您可以键入Alt+"forzsh
来引用它。
例如,您刚刚运行:
$ find /usr/local -size +1M
/usr/local/lib/liblzma.a
/usr/local/share/doc/sudo/ChangeLog
/usr/local/share/perl/5.18.2/Unicode/Unihan/Definition.db
/usr/local/share/perl/5.18.2/Unicode/Unihan/RSKangXi.db
/usr/local/share/perl/5.18.2/Unicode/Unihan/IRG_TSource.db
/usr/local/share/perl/5.18.2/Unicode/Unihan/HanYu.db
/usr/local/share/perl/5.18.2/Unicode/Unihan/RSUnicode.db
/usr/local/share/perl/5.18.2/Unicode/Unihan/IRG_GSource.db
/usr/local/share/perl/5.18.2/Unicode/Unihan/IRGKangXi.db
/usr/local/share/perl/5.18.2/Unicode/Unihan/IRGHanyuDaZidian.db
并且您想打开vim
上面的 sudo ChangeLog。使用第一种方法,您需要输入:
vim ¬9
采用第二种方法:
vim /我们Alt+/
并重复此操作,Alt+/直到看到更改日志。
采用第三种方法:
维姆Alt+CCtrl+YAlt+Y
并重复此操作,Alt+Y直到看到更改日志。
最后一种方法可用于您的$s1
查询。
不要存储在数组中,而是killring
存储在数组中(如$s
)并用于$s[1]
第一行,$s[2]
第二行......
copy-screen() {
screen -X eval copy 'stuff "-$ H\r"' 'writebuf .lastoutput'
s=(${(Oaf)"$(<~/.lastoutput)"})
}
zle -N copy-screen
bindkey '\ec' copy-screen
它将Alt+C光标上方的行存储在s
数组中。
无论如何,我们检索的是屏幕上显示的内容,这不一定与最后一个命令输出的内容相同。例如printf 'a\bc \n'
输出 5 个字节a
、BS、c
SPC 和 LF,但仅显示c
.
答案2
如果你能忍受 Bash 数组的丑陋,你可以这样做
mapfile res < <(find -name <pattern>)
或者
mapfile res < <(locate <pattern>)
这会将您的行保存到数组中res
。
然后您可以看到匹配项并迭代它们:
$ echo "${res[@]}" # lists all matches
$ editor ${res[2]} # opens the third match
聚苯乙烯
不过,我只是用鼠标选择我需要的行。或者只是做
$ editor `locate <pattern>`
如果我知道没有太多结果或“花哨”的字符。
答案3
答案4
我想到了一种方法。您可以在 shell 环境中使用“EDITOR”指定的全屏编辑器。按^X^E
(ctrl-x、ctrl-e)启动编辑器。在编辑器(例如 vim)中,您可以运行:
:r!find /
结果将被导入,然后您可以将输出修剪为您想要的内容,当您写入并退出时,内容将作为命令运行,就像您在 shell 提示符下输入它一样。