我有一个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将其输入拆分为子命令的参数。事实证明,该命令支持写出与空分隔符匹配的文件名(并且是比任何方式都更好的查找文件工具)。vlc
Artist
Name
-
Track
Name.mp3
-0
xargs
\0
find
find
ls | 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* &