Bash 合并目录中所有文件夹中的所有文件

Bash 合并目录中所有文件夹中的所有文件,bash,Bash,所以我有一个叫做Genomes的文件夹,在这个文件夹里我有3000个文件夹,里面都有一个文件。我想把所有这些文件合并成一个大文件。我认为在bash中应该有一种方法来实现这一点,但我不确定如何实现 ( cd Genomes cat */* > ../Genomes-combined-data ) 这将创建一个与基因组目录相同级别的单个文件,其中包含所有文件的串联 唯一的问题可能是参数列表的长度。如果这是个问题,那么(假设基因组目录中没有文件,只有目录): 这将使用find来确定名称,并将列

所以我有一个叫做Genomes的文件夹,在这个文件夹里我有3000个文件夹,里面都有一个文件。我想把所有这些文件合并成一个大文件。我认为在bash中应该有一种方法来实现这一点,但我不确定如何实现

(
cd Genomes
cat */* > ../Genomes-combined-data
)
这将创建一个与
基因组
目录相同级别的单个文件,其中包含所有文件的串联

唯一的问题可能是参数列表的长度。如果这是个问题,那么(假设
基因组
目录中没有文件,只有目录):

这将使用
find
来确定名称,并将列表拆分为可管理的块。最终结果基本上是相同的,因为您将拥有一个文件,其中包含以前在3000个单独文件中的所有数据。但是,正如a中所指出的,与使用
*/*
相比,文件中数据的顺序可能会有所不同。如有必要,您可以使用
查找-print0
通过管道传输到
sort-z
通过管道传输到
xargs-0 cat
以处理名称中的任何空格或换行符。所有这些都不是POSIX工具的完全标准扩展

find Genomes -type f -print0 | sort -z | xargs -0 cat > Genomes-combined-data
如果你知道你有健全的名字,你可以简单地使用:

find Genomes -type f -print | sort | xargs cat > Genomes-combined-data
您可以根据自己的喜好使排序条件变得复杂


当然,您可以将输出文件放在任何方便的位置。不要将输出文件放在
find
可以找到它的地方-除非你非常幸运,否则这会导致磁盘已满

这里有一个一行程序,它将对所有文件名进行排序,并将它们的内容连接到一个文件(
基因组所有
),每个文件都有一个标题,指示它们的名称:

(find Genomes -type f | sort | xargs tail -n +1) > Genomes-all

你的意思是要连接所有文件?您是否需要将它们连接成任何特定的顺序?您的文件夹是否比
基因组
下一级更深入?请提供一些细节。最终结果不一样
*/*
按词汇对文件进行排序,
查找
不:)。@MichałGórny:好的,公正的评论。使用
附加而不是覆盖。
(find Genomes -type f | sort | xargs tail -n +1) > Genomes-all