Shell 为什么cat不能在xargs中使用参数-0?

Shell 为什么cat不能在xargs中使用参数-0?,shell,sh,freebsd,xargs,Shell,Sh,Freebsd,Xargs,我正在尝试实施此解决方案: 使用“查找”对要选择的多个文件进行分类 因此,我已尝试实施该帖子中提供的BSD解决方案,但如果我这样做: $ find "/tmp/database" -name "FOO 03-11*" /tmp/database/01/FOO 03-11.txt /tmp/database/03/FOO 03-11.txt /tmp/database/02/FOO 03-11.txt /tmp/database/05/FOO 03-11

我正在尝试实施此解决方案:

使用“查找”对要选择的多个文件进行分类

因此,我已尝试实施该帖子中提供的BSD解决方案,但如果我这样做:

$ find "/tmp/database"  -name "FOO 03-11*" 
/tmp/database/01/FOO 03-11.txt
/tmp/database/03/FOO 03-11.txt
/tmp/database/02/FOO 03-11.txt
/tmp/database/05/FOO 03-11.txt
/tmp/database/04/FOO 03-11.txt

$ find "/tmp/database"  -name "FOO 03-11*" | sort 
/tmp/database/01/FOO 03-11.txt
/tmp/database/02/FOO 03-11.txt
/tmp/database/03/FOO 03-11.txt
/tmp/database/04/FOO 03-11.txt
/tmp/database/05/FOO 03-11.txt

$ find "/tmp/database"  -name "FOO 03-11*" | sort | xargs -0
/tmp/database/01/FOO 03-11.txt
/tmp/database/02/FOO 03-11.txt
/tmp/database/03/FOO 03-11.txt
/tmp/database/04/FOO 03-11.txt
/tmp/database/05/FOO 03-11.txt

$ find "/tmp/database"  -name "FOO 03-11*" | sort | xargs -0 cat
cat: /tmp/database/01/FOO 03-11.txt
/tmp/database/02/FOO 03-11.txt
/tmp/database/03/FOO 03-11.txt
/tmp/database/04/FOO 03-11.txt
/tmp/database/05/FOO 03-11.txt
: No such file or directory
$ 
我仍然无法让cat命令工作。让cat使用xargs-0的文章的公认答案缺少什么

我使用的是FreeBSD12及其shell/bin/sh,据我所知是POSIX

很明显,我错误地期望这个find/sort/xargs/cat序列输出文件的内容,如下所示:

$ cat "/tmp/database/01/FOO 03-11.txt"
CONTENT OF FILE /tmp/database/01/FOO 03-11.txt
$ cat "/tmp/database/02/FOO 03-11.txt"
CONTENT OF FILE /tmp/database/02/FOO 03-11.txt
$ cat "/tmp/database/03/FOO 03-11.txt"
CONTENT OF FILE /tmp/database/03/FOO 03-11.txt
$ cat "/tmp/database/04/FOO 03-11.txt"
CONTENT OF FILE /tmp/database/04/FOO 03-11.txt
$ cat "/tmp/database/05/FOO 03-11.txt"
CONTENT OF FILE /tmp/database/05/FOO 03-11.txt
因此,预期产出为:

$ find "/tmp/database"  -name "FOO 03-11*" | sort | xargs -0 cat
CONTENT OF FILE /tmp/database/01/FOO 03-11.txt
CONTENT OF FILE /tmp/database/02/FOO 03-11.txt
CONTENT OF FILE /tmp/database/03/FOO 03-11.txt
CONTENT OF FILE /tmp/database/04/FOO 03-11.txt
CONTENT OF FILE /tmp/database/05/FOO 03-11.txt
FreeBSD xargs不支持已删除答案中建议的-d,但该答案很有用,因为它澄清了-0的用法,并给出了将新行字符作为分隔符处理的提示,因此包含将\n转换为\0的tr可以为FreeBSD提供技巧:

$ find "/tmp/database"  -name "FOO 03-11*" | sort | tr '\n' '\0' | xargs -0 cat
CONTENT OF FILE /tmp/database/01/FOO 03-11.txt
CONTENT OF FILE /tmp/database/02/FOO 03-11.txt
CONTENT OF FILE /tmp/database/03/FOO 03-11.txt
CONTENT OF FILE /tmp/database/04/FOO 03-11.txt
CONTENT OF FILE /tmp/database/05/FOO 03-11.txt
作为补充说明,在GNU Linux中可以使用-d'\n':

FreeBSD xargs不支持已删除答案中建议的-d,但该答案很有用,因为它澄清了-0的用法,并给出了将新行字符作为分隔符处理的提示,因此包含将\n转换为\0的tr可以为FreeBSD提供技巧:

$ find "/tmp/database"  -name "FOO 03-11*" | sort | tr '\n' '\0' | xargs -0 cat
CONTENT OF FILE /tmp/database/01/FOO 03-11.txt
CONTENT OF FILE /tmp/database/02/FOO 03-11.txt
CONTENT OF FILE /tmp/database/03/FOO 03-11.txt
CONTENT OF FILE /tmp/database/04/FOO 03-11.txt
CONTENT OF FILE /tmp/database/05/FOO 03-11.txt
作为补充说明,在GNU Linux中可以使用-d'\n':


它可以工作-没有这样的目录。xargs正确地将输入传递给cat—它正常工作,然后cat告诉您没有这样的目录—很可能也是正确的。你还期待什么吗?为什么?您认为-0是什么意思?文件在/tmp/database/0x下,我想对它们进行分类。我对问题进行了编辑,以使预期的输出更加清晰。如果您可以排除这样一种可能性,即您可能有一天有太多的文件,如果您将它们全部输入到一个cat中,您可能会得到一个arglist过长错误,您还可以执行cat$find…|排序。我尝试过,但该解决方案不适用于名称中带有空格的文件,至少不在FreeBSD$cat$find/tmp/database-name FOO 03-11*| sort cat:/tmp/database/01/FOO的/bin/sh中:没有这样的文件或目录…它可以工作-没有这样的目录。xargs正确地将输入传递给cat—它正常工作,然后cat告诉您没有这样的目录—很可能也是正确的。你还期待什么吗?为什么?您认为-0是什么意思?文件在/tmp/database/0x下,我想对它们进行分类。我对问题进行了编辑,以使预期的输出更加清晰。如果您可以排除这样一种可能性,即您可能有一天有太多的文件,如果您将它们全部输入到一个cat中,您可能会得到一个arglist过长错误,您还可以执行cat$find…|排序。我尝试过,但该解决方案不适用于名称中带有空格的文件,至少不在FreeBSD$cat$find/tmp/database-name FOO 03-11*| sort cat:/tmp/database/01/FOO中的/bin/sh中:没有这样的文件或目录……根据在线手册,find'/tmp/database'-name'FOO 03-11*'-print0 | sort-z | xargs-0 cat应该可以在FreeBSD上工作。如果文件名中包含“,\”或换行符,则答案中的一个将中断,而此文件则不会。谢谢,我确认它在FreeBSD中确实有效,但我不知道-z和-print0参数。在这种特殊情况下,我不打算处理包含“、或\的文件,这些文件可能是文件名的错误字符选择,但这是一个有用的澄清。根据在线手册,查找“/tmp/database'-name'FOO 03-11*”-print0 | sort-z | xargs-0 cat应该适用于FreeBSD。如果文件名中包含“,\”或换行符,则答案中的一个将中断,而此文件则不会。谢谢,我确认它在FreeBSD中确实有效,但我不知道-z和-print0参数。在这种特殊情况下,我不打算处理包含',或\的文件,这些文件可能是文件名的错误字符选择,但这是一个有用的澄清。