Bash

使用管道將文件定向到打開它們的程序

  • November 11, 2013

我有一個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。幸運的是,有辦法解決這個問題。如果您使用-0to 選項xargs,它將使用 null\0將其輸入拆分為子命令的參數。事實證明,該find命令支持用空分隔符寫出文件名匹配項(並且find是查找文件的更好工具ls | grep)。

所以這可能是一個更好的管道:

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

引用自:https://unix.stackexchange.com/questions/100713