无法使用 find ./subdir/* -print0 | 连接文件排序| xargs -0 cat > merge.txt

无法使用 find ./subdir/* -print0 | 连接文件排序| xargs -0 cat > merge.txt

split我正在尝试连接处理with输出的片段而产生的数千个文件

find ./subdir/* -print0 | sort | xargs -0 cat > full_merge.txt

下面的文件subdir 是:

something.foo.aaaaa.output
something.foo.aaaab.output
something.foo.aaaac.output

...

但我得到File name too long

为什么?

答案1

不知道为什么你会收到这个错误。

find ./subdir/* -print0

(假设--print0是一个拼写错误)将输出一个大的非终止行,其中包含一些 NUL 字符。因为它不以换行符结尾,并且因为它包含 NUL 字符,所以它不是文本,因此文本实用程序的行为(例如)sort未指定。 GNU 排序,会将其视为一大行并添加回丢失的换行符。

也许您正在使用 busybox sort,据我所知,它也将输入中的 NUL 字符视为行分隔符,但输出行以换行符终止。

xargs -0需要 NUL 分隔的记录。因此,使用 GNU 排序,xargs会将sort输出视为与由 加上 的虚假元素生成的列表相同,find -print0该虚假元素由 所添加的额外换行符组成sort

在 busybox 的情况下sort,因为所有 NUL 都已转换为换行符,所以据所知只有一条记录xargs -0,因此它将cat使用包含换行符的一个巨大文件名进行调用。

在这里,如果你想对文件名列表进行排序,你需要使用 GNUsort及其-z选项:

find subdir -type f -print0 | sort -z | xargs -r0 cat > merge.txt

或者假设文件名不包含换行符并运行:

find subdir -type f | sort | tr '\n' '\0' | xargs -r0 cat > merge.txt

既然你使用了zsh标签,你也可以做以下所有事情zsh

autoload zargs
zargs subdir/**/*(D.) -- cat > merge.txt

这实际上将为您提供更接近您要查找的内容的排序顺序。

答案2

xargs'-0参数适用于当输入是 NUL 分隔的,但事实并非如此。如果你想让它起作用,你必须在前面的命令中用 NUL 分隔。不幸的是,似乎没有任何方法可以做到这一点POSIX 兼容:

find ./subdir/* -print0 | sort -z | xargs -0 cat -- > full_merge.txt

相关内容