所以我有一个名为Genomes的文件夹,在这个文件夹中我有3000个文件夹,里面都有1个文件。我想将所有这些文件合并到一个大文件中。我认为应该有一种方法在bash中这样做,但我不确定如何去做。
答案 0 :(得分:2)
(
cd Genomes
cat */* > ../Genomes-combined-data
)
这会创建与Genomes
目录相同级别的单个文件,其中包含所有文件的串联。
唯一的问题可能是参数列表的长度。如果这是一个问题,那么(假设Genomes
目录中没有文件 - 只有目录):
find Genomes -type f -exec cat {} + > Genomes-combined-data
这使用find
来确定名称并将列表拆分为可管理的块。最终结果基本相同,因为您将拥有一个包含以前在3000个单独文件中的所有数据的文件。但是,正如Michał Górny中comment指出的那样,与使用*/*
相比,文件中数据的顺序可能会有所不同。如有必要,您可以find ... -print0
将sort -z
用管道传输到xargs -0 cat
以find Genomes -type f -print0 | sort -z | xargs -0 cat > Genomes-combined-data
来管理名称中的任何空格或换行符。所有这些都不是POSIX工具的完全标准扩展。
find Genomes -type f -print | sort | xargs cat > Genomes-combined-data
如果您知道自己有合理的名字,可以直接使用:
find
您可以根据需要使排序标准变得复杂。
当然,您可以将输出文件放在任何方便的位置。不要将输出文件放在{{1}}找到它的地方 - 这将导致一个完整的磁盘,除非你非常幸运。
答案 1 :(得分:0)
这里是一个单行程序,它将对所有文件名进行排序,并将其内容连接到一个文件(Genomes-all
)中,每个文件都有一个标题,表示其名称:
(find Genomes -type f | sort | xargs tail -n +1) > Genomes-all