如何按正确顺序合并15000个序列命名的file_n.pdb文件?
按顺序合并大量编号PDB文件的解决方案
这个问题我太熟了!当文件数量过万时,直接用cat file_*.pdb确实会因为shell命令行参数长度限制报错,而find默认是按文件系统的inode顺序遍历,完全不会按我们想要的数字排序,简直踩坑。下面给你两个靠谱的方法,完美解决顺序和参数过长的问题:
方法一:Bash循环逐个处理(最稳妥)
直接用for循环按数字顺序遍历每个文件,逐个追加到输出文件里,既保证顺序,又不会触发参数超限:
# 先清空输出文件(如果之前有生成过的话) > merged_output.pdb # 从1到15000遍历每个编号 for i in {1..15000}; do # 先检查文件是否存在,避免缺失编号时报错 if [ -f "file_$i.pdb" ]; then cat "file_$i.pdb" >> merged_output.pdb fi done
这个方法的好处是逻辑清晰,哪怕中间有个别编号的文件缺失,也不会中断整个合并过程,只会跳过不存在的文件。
方法二:用printf生成有序文件名列表+Xargs分批次处理
如果觉得循环速度有点慢,可以用printf按顺序生成所有文件名,再通过xargs分批次传给cat,既保证顺序又提升效率:
> merged_output.pdb # 生成有序文件名,每次传给cat 200个文件(可根据自己系统调整数量) printf "file_%d.pdb\n" {1..15000} | xargs -n 200 cat >> merged_output.pdb
这里printf "file_%d.pdb\n" {1..15000}会严格按数字顺序输出所有文件名,xargs -n 200则会把每200个文件名作为一组传给cat,避免单次传递过多文件触发参数过长错误。
小提醒
合并前建议先拿前10个文件测试一下命令效果,比如把{1..15000}改成{1..10},确认输出顺序正确后再正式执行大合并,避免误操作。
内容的提问来源于stack exchange,提问作者sodiumnitrate
相关产品推荐
相关产品推荐

