grep后直接打开文件

Noo*_*oor 0 linux grep

我在 linux 中遇到管道问题,

ls | grep feedback
Run Code Online (Sandbox Code Playgroud)

我有一个打开的 xdg-open 的别名,如何让 grep 中的文件名直接打开

这不起作用

ls | grep feedback | open
Run Code Online (Sandbox Code Playgroud)

Den*_*nis 5

xargs 从标准输入构建和执行命令行

语法很简单:

ls | grep feeback | xargs open
Run Code Online (Sandbox Code Playgroud)

如果文件名包含空格,这将不起作用。例如,对于名为 的文件foo bar

ls | grep foo | xargs open
Run Code Online (Sandbox Code Playgroud)

上面将尝试打开一个名为 的文件foo,然后打开一个名为的文件bar,因为空格通常分隔参数。

在这种情况下,您可以使用引号来分隔文件名:

ls | grep foo | xargs -I '{}' open '{}'
Run Code Online (Sandbox Code Playgroud)

但是,如果文件名包含空格,则此方法可能会失败。


另一种选择是使用find,它完全避免管道:

find -maxdepth 1 -name '*foo*' -exec open '{}' \;
Run Code Online (Sandbox Code Playgroud)

在这里,-maxdepth 1使 find 仅在当前目录中搜索(即,不包括子目录),-name '*foo*'搜索名称中包含字符串foo的文件,并-exec open {} \;替换{}为已找到的文件名。find 将自动处理特殊字符。


通过命令替换,可以达到类似的结果:

open "$(ls | grep feedback)"
Run Code Online (Sandbox Code Playgroud)

即使文件包含空格,这也会起作用。