$ 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 10.12版本。x (Sierra),如果你在文件名或子目录中有空格,你可以使用以下方法:

find . -name '*.swift' -exec echo '"{}"' \; |xargs wc -l

其他回答

鉴于这篇文章的特定标题,以下是我的建议:

ls | grep ' ' | tr ' ' '<' | sed 's|<|\\ |g'

其思想是将空格转换为任何唯一字符,如'<',然后将其转换为'\ ',反斜杠加空格。然后你可以将其导入到任何你喜欢的命令中,比如:

ls | grep ' ' | tr ' ' '<' | sed 's|<|\\ |g' | xargs -L1 GetFileInfo

这里的关键在于'tr'和'sed'命令;你可以使用'<'以外的任何字符,比如'?,甚至是制表符。

macOS 10.12版本。x (Sierra),如果你在文件名或子目录中有空格,你可以使用以下方法:

find . -name '*.swift' -exec echo '"{}"' \; |xargs wc -l

xargs命令使用空白字符(制表符、空格、新行)作为分隔符。

你可以用-d选项将范围缩小到新的行字符('\n'),就像这样:

ls *.mp3 | xargs -d '\n' mplayer

它只适用于GNU xargs。

MacOS:

ls *.mp3 | tr \\n \\0 | xargs -0 mplayer

更简单和实用的方法(当不需要进一步处理文件名时):

mplayer *.mp3

在macOS (Monterey/12向前,我不确定10.15/Catalina过去了多久)上,如果你的文件名或子目录中有空格,你可以使用以下命令:

mdfind  -0 -onlyin . -name .txt | xargs -0 grep stackoverflow |  wc -l

正如珍的回答所示:

xargs实用程序从标准输入中读取空格、制表符、换行符和文件结束符分隔的字符串,并以这些字符串作为参数执行实用程序。

您希望避免使用空格作为分隔符。这可以通过更改xargs的分隔符来实现。根据手册:

-0修改xargs以NUL('' \0 ")字符作为分隔符, 而不是空格和换行。这预计将用于 与find(1)中的-print0函数一致。

find . -name 'Lemon*.mp3' -print0 | xargs -­0 -i mplayer '{}' 

在我的例子中,这有助于删除带有空格的不同文件。它应该也工作与mplayer。必要的技巧是引用。(在Linux Xubuntu 14.04上测试。)