手机指定文件打包为tar包仅部分文件写入的原因排查
手机tar打包仅包含部分文件的问题排查
操作场景
用户尝试打包手机SD卡中含imgcache、gallery3d、image关键词的文件,执行了以下命令:
先获取目标文件路径:
./busybox find /sdcard/ -type f | grep -e imgcache -e gallery3d -e image | ./busybox xargs
再执行打包命令:
./busybox find /sdcard/ -type f | grep -e imgcache -e gallery3d -e image | ./busybox xargs ./busybox tar c >a.tar
结果发现生成的a.tar里只有部分文件,想知道是不是文件数量过多导致的。
核心原因分析
- xargs分批执行覆盖了tar包:这是最常见的问题。系统对单个命令的参数长度有上限,当找到的文件太多、总路径长度超过这个限制时,xargs会把文件名分成多批,每一批都单独执行
tar c命令。但tar c是创建新包,每执行一次就会覆盖之前的a.tar,最后你拿到的自然只有最后一批文件的打包结果,前面的都被冲掉了。 - 特殊文件名导致处理失败:如果某些文件名包含空格、换行、引号这类特殊字符,grep和默认的xargs处理会出错——比如空格会被xargs当成参数分隔符,把一个文件名拆成两个,tar找不到对应的文件,就会跳过这些文件。
- 权限不足被跳过:部分文件可能没有读权限,tar尝试读取时会直接跳过,也会表现为只打包了部分文件。
可行的解决办法
- 用tar的文件列表参数绕过xargs限制:
# 先把目标文件路径写入临时文件 ./busybox find /sdcard/ -type f | grep -e imgcache -e gallery3d -e image > filelist.txt # 让tar从文件里读取要打包的文件名 ./busybox tar c --files-from=filelist.txt > a.tar - 处理含特殊字符的文件名:
把grep的匹配逻辑移到find里,同时用null分隔符避免特殊字符干扰:./busybox find /sdcard/ -type f \( -name "*imgcache*" -o -name "*gallery3d*" -o -name "*image*" \) -print0 | ./busybox xargs -0 ./busybox tar c > a.tar - 检查文件权限:确保执行命令的用户对所有目标文件有读权限,必要时用
chmod调整权限后再打包。
内容的提问来源于stack exchange,提问作者YuSheng
相关产品推荐
相关产品推荐

