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