$ ls *mp3 | xargs mplayer
Playing Lemon.
File not found: 'Lemon'
Playing Tree.mp3.
File not found: 'Tree.mp3'
Exiting... (End of file)
我的命令失败了,因为“Lemon Tree.mp3”文件包含空格,所以xargs认为它是两个文件。我能让find + xargs与这样的文件名一起工作吗?
$ ls *mp3 | xargs mplayer
Playing Lemon.
File not found: 'Lemon'
Playing Tree.mp3.
File not found: 'Tree.mp3'
Exiting... (End of file)
我的命令失败了,因为“Lemon Tree.mp3”文件包含空格,所以xargs认为它是两个文件。我能让find + xargs与这样的文件名一起工作吗?
当前回答
MacOS上的xargs没有-d选项,所以这个解决方案使用-0代替。
获取ls每行输出一个文件,然后将换行符转换为空值,并告诉xargs使用空值作为分隔符:
Ls -1 *mp3 | tr "\n" "\0" | xargs -0 mplayer
其他回答
MacOS上的xargs没有-d选项,所以这个解决方案使用-0代替。
获取ls每行输出一个文件,然后将换行符转换为空值,并告诉xargs使用空值作为分隔符:
Ls -1 *mp3 | tr "\n" "\0" | xargs -0 mplayer
替代解决方案可能会有所帮助……
您还可以使用Perl在行尾添加一个空字符,然后在xargs中使用-0选项。不像xargs -d '\n'(在已批准的答案中)-这适用于任何地方,包括OS X。
例如,要递归地列出(执行,移动等)可能包含空格或其他有趣字符的MPEG3文件-我会使用:
find . | grep \.mp3 | perl -ne 'chop; print "$_\0"' | xargs -0 ls
(注意:对于过滤,我更喜欢更容易记住的“| grep”语法而不是“find’s”——name参数。)
Ls | grep mp3 | sed -n“7p”| xargs -i mplayer {}
注意,在上面的命令中,xargs将为每个文件重新调用mplayer。这对于mplayer来说可能是不可取的,但是对于其他目标来说可能是可以的。
Try
find . -name \*.mp3 -print0 | xargs -0 mplayer
而不是
ls | grep mp3
find . -name 'Lemon*.mp3' -print0 | xargs -0 -i mplayer '{}'
在我的例子中,这有助于删除带有空格的不同文件。它应该也工作与mplayer。必要的技巧是引用。(在Linux Xubuntu 14.04上测试。)