Bash环境下批量快速复制100K个文件夹的高效方法咨询
高效批量复制大量文件夹的解决方案
哈哈,这个问题我太有共鸣了!用while循环挨个跑cp确实会因为频繁启动进程拖慢速度——毕竟每执行一次cp就要创建一个新进程,10万个文件夹的话,进程创建的开销累加起来就恐怖了。给你几个亲测高效的方案:
1. 用xargs并行批量处理
xargs可以把文件里的路径批量传给cp,还能开启并行进程,大幅提升速度:
xargs -I {} -P 8 cp -R {} <dest_folder> < file_with_paths.txt
-I {}:用{}作为路径的占位符,替换成文件里的每一行内容-P 8:启动8个并行的cp进程,你可以根据自己的硬件调整(SSD磁盘可以设12-16,机械硬盘别超过4-6,避免IO瓶颈)
2. 用rsync批量同步
rsync本身就比cp更高效,尤其是批量操作时,它会优化文件传输逻辑,还支持断点续传:
rsync -av --files-from=file_with_paths.txt / <dest_folder>
注意:file_with_paths.txt里最好写绝对路径,这样rsync能准确找到源文件;如果是相对路径,要确保当前工作目录是这些路径的基准目录。-av参数表示归档模式(保留权限、时间戳等)+ 详细输出。
3. 用tar打包流直接解压
如果你的源目录和目标目录在不同存储设备上,用tar打包成数据流再解压,能减少零散文件的IO开销:
tar -c -T file_with_paths.txt | tar -x -C <dest_folder>
-c:创建打包流-T file_with_paths.txt:指定要打包的路径列表- 管道后面的
tar -x -C <dest_folder>:把打包流直接解压到目标目录,全程没有中间临时文件,效率拉满
小提醒
- 并行操作时别贪多,机械硬盘的IO吞吐量有限,开太多并行进程反而会因为IO阻塞变慢
- 操作前先拿几个文件夹测试一下命令,确保路径和参数正确,避免误操作
内容的提问来源于stack exchange,提问作者London guy
相关产品推荐
相关产品推荐

