如何让tar找到首个匹配文件后停止搜索?
解决tar 1.26提取指定文件后停止遍历的问题
问题分析
你当前的循环方式每次调用tar都会从头遍历整个tar包,即便找到目标文件仍会扫描剩余内容,这是耗时过长的核心原因。而--occurrence 1在tar 1.26中仅用于处理重复文件名的提取场景,无法终止tar包的遍历过程。
可行解决方案
方案1:添加--quit参数终止遍历
给tar命令加上-q(或长选项--quit),让tar在成功提取目标文件后立即停止扫描tar包,示例命令:
while read i do tar -xvfq tarball.tar.gz "$i" done < filelist.txt
-q选项会让tar完成指定文件的提取操作后立刻退出,不再遍历tar包剩余内容,能显著降低单次提取的耗时。
方案2:一次性提取所有目标文件(更高效)
避免循环多次启动tar进程,直接将所有需要提取的文件路径一次性传给tar,让tar仅遍历一次tar包即可完成所有提取:
- 若文件路径无特殊字符(如空格):
tar -xvf tarball.tar.gz $(cat filelist.txt)
- 若文件路径包含空格或特殊字符,用
xargs处理:
cat filelist.txt | xargs -d '\n' tar -xvf tarball.tar.gz
这种方式省去了多次启动tar和重复遍历tar包的开销,文件列表越大,效率提升越明显。
补充:处理重复文件名的情况
如果tar包中存在同名文件,需要仅提取第一个匹配项,可结合--occurrence 1与-q使用:
while read i do tar -xvfq --occurrence 1 tarball.tar.gz "$i" done < filelist.txt
内容的提问来源于stack exchange,提问作者Haakonkas
相关产品推荐
相关产品推荐

