$ 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与这样的文件名一起工作吗?
当前回答
xargs实用程序从标准输入中读取空格、制表符、换行符和文件结束符分隔的字符串,并以这些字符串作为参数执行实用程序。
您希望避免使用空格作为分隔符。这可以通过更改xargs的分隔符来实现。根据手册:
-0修改xargs以NUL('' \0 ")字符作为分隔符, 而不是空格和换行。这预计将用于 与find(1)中的-print0函数一致。
如:
find . -name "*.mp3" -print0 | xargs -0 mplayer
回答关于播放第七首mp3的问题;运行起来更简单
mplayer "$(ls *.mp3 | sed -n 7p)"
其他回答
替代解决方案可能会有所帮助……
您还可以使用Perl在行尾添加一个空字符,然后在xargs中使用-0选项。不像xargs -d '\n'(在已批准的答案中)-这适用于任何地方,包括OS X。
例如,要递归地列出(执行,移动等)可能包含空格或其他有趣字符的MPEG3文件-我会使用:
find . | grep \.mp3 | perl -ne 'chop; print "$_\0"' | xargs -0 ls
(注意:对于过滤,我更喜欢更容易记住的“| grep”语法而不是“find’s”——name参数。)
xargs命令使用空白字符(制表符、空格、新行)作为分隔符。
你可以用-d选项将范围缩小到新的行字符('\n'),就像这样:
ls *.mp3 | xargs -d '\n' mplayer
它只适用于GNU xargs。
MacOS:
ls *.mp3 | tr \\n \\0 | xargs -0 mplayer
更简单和实用的方法(当不需要进一步处理文件名时):
mplayer *.mp3
Try
find . -name \*.mp3 -print0 | xargs -0 mplayer
而不是
ls | grep mp3
xargs实用程序从标准输入中读取空格、制表符、换行符和文件结束符分隔的字符串,并以这些字符串作为参数执行实用程序。
您希望避免使用空格作为分隔符。这可以通过更改xargs的分隔符来实现。根据手册:
-0修改xargs以NUL('' \0 ")字符作为分隔符, 而不是空格和换行。这预计将用于 与find(1)中的-print0函数一致。
如:
find . -name "*.mp3" -print0 | xargs -0 mplayer
回答关于播放第七首mp3的问题;运行起来更简单
mplayer "$(ls *.mp3 | sed -n 7p)"
鉴于这篇文章的特定标题,以下是我的建议:
ls | grep ' ' | tr ' ' '<' | sed 's|<|\\ |g'
其思想是将空格转换为任何唯一字符,如'<',然后将其转换为'\ ',反斜杠加空格。然后你可以将其导入到任何你喜欢的命令中,比如:
ls | grep ' ' | tr ' ' '<' | sed 's|<|\\ |g' | xargs -L1 GetFileInfo
这里的关键在于'tr'和'sed'命令;你可以使用'<'以外的任何字符,比如'?,甚至是制表符。