我偶然看到这篇文章:从 stdin 读取时如何保留 mplayer 中的控制台输入?
但那里的答案对我不起作用。
我正在运行以下命令:
ls -l | grep -e mp3 -e wav | awk '{i=index($0,$9); $0=substr($0,i); printf "./"$0"\n"}' | grep " " | mplayer -playlist -
这很好用。 (减去控件)
我尝试这样做:(如上述问题中所建议的)
ls -l | grep -e mp3 -e wav | awk '{i=index($0,$9); $0=substr($0,i); printf "./"$0"\n"}' | grep " " | mplayer -playlist /dev/fd/3 3<&0 </dev/tty
它给了我这个:
Playing /dev/fd/./Pink Floyd - Another Brick in the Wall.mp3.
File not found: '/dev/fd/./Pink Floyd - Another Brick in the Wall.mp3'
Failed to open /dev/fd/./Pink Floyd - Another Brick in the Wall.mp3.
有人可以解释我做错了什么(以及如何解决它?)
目前使用 sh 运行 ubuntu 12.10。
答案1
只是您的文件路径是相对的,并且 mplayer 似乎将其解释为相对于播放列表的位置(而不是您的工作目录或其他位置)。对于零次近似,您可以将“./”替换为当前目录,但我发现更容易的是使用
find "$(pwd)" -maxdepth 1 -name \*.mp3 -o -name \*.wav | mplayer -playlist /dev/fd/3 3<&0 0</dev/tty
(所以你的ls
, grep
,awk
被这个 取代find
。诚然,我没有完全仔细检查它是否完全等效。删除 -maxdepth 会使其递归到子目录中,这可能就是你想要的?man find
是你的朋友。 )
答案2
mplayer
认为播放列表中的相对路径是相对于播放列表所在目录的。尝试使用绝对路径;将你的awk
脚本更改为类似的内容
awk -v dir="$(pwd)" '{ ... ; printf dir "/" $0 "\n" }'