如何高效压缩data_开头子文件夹中匹配*test*.npy的Numpy文件?
高效压缩指定Numpy文件的方法
问题根源
你用的globstar递归通配符在文件数量较多时,bash需要先遍历所有目录生成匹配的文件名列表,这个过程会消耗大量内存和时间,导致整体速度变慢,甚至不如直接压缩所有文件。
优化方案
方案1:用find+tar组合(最稳妥高效)
find的递归查找效率比bash的globstar更高,尤其适合大量文件的场景,同时通过管道传递文件列表避免内存占用过高:
find data* -type f -name "*test*.npy" -print0 | tar -czvf data.tar.gz --null -T -
-print0和--null:处理文件名包含空格、特殊字符的情况,避免出错-T -:告诉tar从标准输入读取要压缩的文件列表
方案2:降低压缩级别或换用更快的压缩算法
默认的gzip压缩级别是6,平衡压缩率和速度,如果追求速度,可以调低级别;或者换用zstd(大部分现代系统支持),它的压缩速度比gzip快数倍,压缩率也不逊色:
- 调低gzip级别(最快的级别1):
find data* -type f -name "*test*.npy" -print0 | tar -cvf data.tar.gz --compress-program='gzip -1' --null -T -
- 用zstd压缩:
find data* -type f -name "*test*.npy" -print0 | tar --zstd -cvf data.tar.zst --null -T -
方案3:提前生成文件列表再压缩
如果需要多次复用这个文件列表,可以先把匹配的文件路径写入临时文件,再让tar读取:
find data* -type f -name "*test*.npy" > file_list.txt tar -czvf data.tar.gz -T file_list.txt rm file_list.txt
这个方法适合需要反复操作的场景,避免重复查找文件。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

