简单场景:我正在寻找wsdl在项目中丢失的文件。
$ find -name '*.wsdl'
./some/very/very/long/way/to/some/lost/directory/filename.wsdl
Run Code Online (Sandbox Code Playgroud)
现在我知道它在哪里,我想对这个文件做一些事情,比如编辑它。是否可以使用find较早返回的路径,而不是复制/粘贴我的命令后面的路径?就像可以访问您输入的最后一个参数!$或使用!!.
我已经读到可以使用$?,但它只会返回一个错误:0: command not found
$ echo $?
0: command not found
Run Code Online (Sandbox Code Playgroud)
ahi*_*end 92
没有特殊的 bash 变量。
$? 包含最后一条命令的退出代码(0 = 成功,>0 = 错误代码)
您可以使用find带有-exec标志的输出,如下所示:
find -name '*.wsdl' -exec emacs {} \;
Run Code Online (Sandbox Code Playgroud)
将{}替换为由 找到的文件名find。这将为每个找到的文件执行命令。如果要使用所有找到的文件作为参数执行命令,请使用 a +at teh end ,如下所示:
find -name '*.wsdl' -exec emacs {} +
Run Code Online (Sandbox Code Playgroud)
这将打开一个 emacs 实例,并在其中打开所有找到的 .wsdl 文件。
更通用的解决方案是将输出存储在变量中:
result=$(find -name '*.wsdl')
emacs $result
Run Code Online (Sandbox Code Playgroud)
这适用于所有命令,而不仅仅是查找。虽然您可能还会使用xargs:
find -name '*.wsdl' | xargs emacs {}
Run Code Online (Sandbox Code Playgroud)
小智 54
如果您不介意最后一个命令执行两次,这里有一个快速的 hack 方法,可以用最少的击键完成您想要的操作。
使用反引号,ala:
`!!`
例如
$ 查找。-name HardToFind.txt some/crazy/path/to/HardToFind.txt $ vim`!!`
*编辑:我看到上面链接的“可能被骗”的问题也包含这个答案。仍然与这个直接相关,所以离开它,但对受骗感到抱歉。
cho*_*oba 41
在命令替换中运行命令:
output=$(find -name '*.wsdl')
Run Code Online (Sandbox Code Playgroud)
输出现在存储在output变量中,您可以使用以下命令多次使用该变量:
echo "$output"
Run Code Online (Sandbox Code Playgroud)