【问题标题】:Why cat does not work with parameter -0 in xargs?为什么 cat 不适用于 xargs 中的参数 -0?
【发布时间】:2021-08-17 23:14:46
【问题描述】:

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

Make xargs handle filenames that contain spaces

cat 几个要使用find 选择的文件。

因此,我尝试实现该帖子中提供的 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 命令正常工作。所提供帖子的接受答案中缺少什么以使catxargs -0 一起工作?

我正在使用 FreeBSD 12 及其外壳 @9​​87654328@,据我所知是 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

【问题讨论】:

  • 它有效 - 没有这样的目录。 xargs 正确地将输入传递给cat - 它工作正常,然后cat 告诉你没有这样的目录 - 也很可能是正确的。你期待别的吗?为什么?你认为-0 是什么意思?
  • 这些文件在/tmp/database/0x 下,我想对它们进行分类。我已经编辑了问题,因此预期的输出更加清晰。
  • 如果您可以排除这样一种可能性,即您可能一天拥有太多文件,如果您将它们一起提供给单个 @987654337,您会收到 arglist too long 错误@,你也可以做一个cat $(find ...| sort)
  • 我试过了,该解决方案不适用于名称中带有空格的文件,至少在 FreeBSD 中的 /bin/sh 中无效 $ cat $(find "/tmp/database" -name "FOO 03-11*" | sort) cat: /tmp/database/01/FOO: No such file or directory ...

标签: shell sh freebsd xargs


【解决方案1】:

FreeBSD xargs 不支持 -d 如已删除的答案中所建议的那样,但答案很有用,因为它澄清了 -0 的用法并提示将换行符作为分隔符处理,因此包含 @ 987654324@ 将 \n 转换为 \0 可以为 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'

find "/tmp/database"  -name "FOO 03-11*" | sort | xargs -d '\n' cat

【讨论】:

  • 根据在线手册find '/tmp/database' -name 'FOO 03-11*' -print0 | sort -z | xargs -0 cat 应该可以在 FreeBSD 上运行。如果文件包含'"\ 或其名称中的换行符,则答案中的那个会中断,而这个不会。
  • 谢谢,我确认它确实在 FreeBSD 中工作,我不知道 -z-print0 参数。在这种特殊情况下,我不打算处理包含 '" 或 \(可以说是文件名的错误字符选择)的文件,但这是一个有用的说明。
猜你喜欢
  • 2013-07-23
  • 2017-07-15
  • 1970-01-01
  • 2017-04-24
  • 1970-01-01
  • 2013-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多