我在 linux 中遇到管道问题,
ls | grep feedback
Run Code Online (Sandbox Code Playgroud)
我有一个打开的 xdg-open 的别名,如何让 grep 中的文件名直接打开
这不起作用
ls | grep feedback | open
Run Code Online (Sandbox Code Playgroud)
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)
即使文件包含空格,这也会起作用。