简单场景:我正在寻找wsdl
在项目中途丢失的文件。
$ find -name '*.wsdl'
./some/very/very/long/way/to/some/lost/directory/filename.wsdl
现在我知道它在哪里了,我想对这个文件做一些事情,比如编辑它。除了复制/粘贴命令后面的路径,是否可以使用find
之前返回的路径?就像可以使用访问您输入的最后一个参数!$
或最后一个命令一样!!
。
我读到过可以使用$?
,但它只会返回一个错误:0: command not found
$ echo $?
0: command not found
答案1
没有针对此问题的特殊 bash 变量。
$?
包含最后一个命令的退出代码(0 = 成功,>0 = 错误代码)
您可以将标志的输出find
与该-exec
标志一起使用,如下所示:
find -name '*.wsdl' -exec emacs {} \;
将{}
被替换为 找到的文件名find
。这将对找到的每个文件执行命令。如果您想以所有找到的文件作为参数执行命令,请+
在末尾使用 ,如下所示:
find -name '*.wsdl' -exec emacs {} +
这将打开一个 emacs 实例,其中打开所有找到的 .wsdl 文件。
更通用的解决方案是将输出存储在变量中:
result=$(find -name '*.wsdl')
emacs $result
这适用于所有命令,而不仅仅是 find。不过你也可以使用xargs
:
find -name '*.wsdl' | xargs emacs {}
答案2
如果您不介意最后一个命令执行两次,这里有一个快速破解方法,可以用最少的击键完成您想要的操作。
使用反引号,ala:
`!!`
例如
$ find .-name HardToFind.txt 一些/疯狂/路径/到/HardToFind.txt $ vim`!!`
*编辑:我看到上面链接的“可能被欺骗”的问题也包含这个答案。仍然与这个问题直接相关,所以保留它,但对于重复的问题感到抱歉。
答案3
在命令替换中运行命令:
output=$(find -name '*.wsdl')
输出现在存储在output
变量中,您可以根据需要多次使用该变量,命令如下:
echo "$output"
答案4
`!!`
是一个很好的解决方案,但如果您想要更快,您可以使用别名。
不幸的是它不起作用:
~$ alias test='echo `!!`'
~$ test
zsh: command not found: !!
因此,请使用`fc -e -`
我使用的示例别名:
复制输出:
alias co='echo `fc -e -` | xclip -in -selection clipboard'
用 vim 打开;如果输出有很多行,则在选项卡中打开所有行:
alias vo='vim -p `fc -e -`'