Bash
使用管道將文件定向到打開它們的程序
我有一個
Music
文件夾,裡面有一些音樂曲目,但組織得不太好。因此,如果我想找到一個特定的曲目,我通常會輸入:ls Music | grep <keyword>
,<keyword>
我希望文件名包含的關鍵字在哪裡。然後我的命令行將返回我正在查找的文件的名稱,<name>
然後打開音樂文件,我將輸入vlc <name> &
。我的問題是是否有可能將所有這些簡化為一個操作?我嘗試使用
ls Music | grep <keyword> | vlc
,但這不成功。我該怎麼做呢?(更一般地說,我將如何將管道用於這種目的?)
你可以用
xargs
這個。它將接收在標準輸入上輸入的內容並將其用作子命令的參數。因此,在您的情況下,它可能如下所示:ls Music | grep <keyword> | xargs vlc &
現在,這個命令序列可能仍然存在一些問題,尤其是空格。預設情況下,
xargs
將在任何空白處拆分其輸入,因此如果您有一個名為 like 的文件Artist Name - Track Name.mp3
,那麼xargs
將發送 5 個單獨的參數到vlc
:Artist
,Name
,-
,Track
,Name.mp3
。幸運的是,有辦法解決這個問題。如果您使用-0
to 選項xargs
,它將使用 null\0
將其輸入拆分為子命令的參數。事實證明,該find
命令支持用空分隔符寫出文件名匹配項(並且find
是查找文件的更好工具ls | grep
)。所以這可能是一個更好的管道:
find Music -iname '*<keyword>*' -print0 | xargs -0 vlc &