使用管道将文件定向到打开它们的程序

使用管道将文件定向到打开它们的程序

我有一个Music文件夹,其中有一些音乐曲目,但组织得不太好。因此,如果我想找到特定的曲目,我通常输入:ls Music | grep <keyword>,其中<keyword>是我期望文件名具有的某个关键字。然后我的命令行将返回我正在查找的文件的名称,<name>然后要打开音乐文件,我将键入vlc <name> &

我的问题是是否有可能将所有这些简化为一项操作?我尝试使用ls Music | grep <keyword> | vlc,但这不成功。我该怎么做呢?

(更一般地说,我将如何将管道用于此类目的?)

答案1

您可以用于xargs此目的。它将获取标准输入上通过管道输入的内容并将其用作子命令的参数。所以在你的情况下它可能看起来像这样:

ls Music | grep <keyword> | xargs vlc &

现在,这个命令序列可能仍然存在一些问题,特别是空格。默认情况下,xargs将在任何空白处分割其输入,因此如果您有一个名为 的文件Artist Name - Track Name.mp3,则将向: , , , ,xargs发送 5 个单独的参数。幸运的是,有一种方法可以解决这个问题。如果您使用选项 to ,它将使用 null将其输入拆分为子命令的参数。事实证明,该命令支持写出与空分隔符匹配的文件名(并且是比任何方式都更好的查找文件工具)。vlcArtistName-TrackName.mp3-0xargs\0findfindls | grep

所以这可能是一个更好的管道:

find Music -iname '*<keyword>*' -print0 | xargs -0 vlc &

答案2

虽然学习如何使用 xargs 非常有用,但在此特别的在这种情况下,最好只使用一个 glob。

vlc Music/*keyword* &  ## will find all filenames containing the string 'keyword'

如果您想要递归性(即:在子目录中查找),那么您可以使用 globstar shell 选项:

shopt -s globstar
vlc Music/**/*keyword* &

相关内容