python3 tar文件打包

背景

  • 需要把文件夹,包括里面的文件,复制到SD卡(单片机文件系统,emmc)中。
  • 单个复制,比较的复杂,需要建立文件夹(mkdir),还要cp(每次只能一个文件)
  • 目前支持untar命令,所以,打算把文件打成tar包(不压缩),然后拷贝到USB挂在的U盘中,然后解压缩的方式,把所有文件,解压复制到指定位置。

 

方法

  • 可以使用VC++或是QT开发这样的工具,但比较耗时,所以,使用python脚本。
  • 本机已经安装好了python的环境,方便脚本的调试运行。

 

打包脚本

这里使用python,打包成tar格式,python打包脚本如下 :

 

import os
import sys
import tarfile

tar_system_dir_name = "system"
tar_user_dir_name = "user"
tar_default_type = ".tar"


def make_tar_package(out_filename, source_dir, tar_type):
    if not os.path.exists(source_dir):
        sys.stdout.write("[tar.err] source dir is null!\n" )
        return
    with tarfile.open(out_filename, tar_type) as tar:
        tar.add(source_dir, os.path.basename(source_dir))


def tar_pak(out_filename, source_dir):
    if not os.path.exists(source_dir):
        sys.stdout.write("[tar.err] source dir is null!\n")
        return
    with tarfile.open(out_filename, "w") as tar:
        tar.add(source_dir, os.path.basename(source_dir))


# 获取上级路径
def get_parent_path():
    return os.path.dirname(os.getcwd().replace('\\', '/'))


# main 函数入口
if __name__ == "__main__":
    _source_dir = ""
    _tar_type = ""

    sys.stdout.write("[tar.file] start!! \n")
    # 文件夹初始化
    if len(sys.argv) >= 2:
        _source_dir = sys.argv[1]
        sys.stdout.write("[tar] source directory:" + _source_dir + "\n")

    if len(sys.argv) >= 3:
        _tar_format = "w:" + sys.argv[2]
        sys.stdout.write("[tar] tar type:" + _tar_type + "\n")

    if _source_dir != "":
        system_src_dir = os.path.join(get_parent_path(), (_source_dir + "/" + tar_system_dir_name)).replace('\\', '/')
        user_src_dir = os.path.join(get_parent_path(), (_source_dir + "/" + tar_user_dir_name)).replace('\\', '/')
    else:
        system_src_dir = os.path.join(get_parent_path(), tar_system_dir_name).replace('\\', '/')
        user_src_dir = os.path.join(get_parent_path(), tar_user_dir_name).replace('\\', '/')

    system_tar_filename = os.path.join(get_parent_path(), _source_dir + "/" + tar_system_dir_name + tar_default_type).replace('\\', '/')
    user_tar_filename = os.path.join(get_parent_path(), _source_dir + "/" + tar_user_dir_name + tar_default_type).replace('\\', '/')

    if os.path.exists(system_src_dir):
        tar_pak(system_tar_filename, system_src_dir)
        sys.stdout.write("[tar.file] " + system_src_dir + " ==>" + system_tar_filename + " \n")
    else:
        sys.stdout.write("[tar.file] not found dir: " + system_src_dir + " \n")

    if os.path.exists(user_src_dir):
        tar_pak(user_tar_filename, user_src_dir)
        sys.stdout.write("[tar.file] " + user_src_dir + " ==>" + user_tar_filename + " \n")
    else:
        sys.stdout.write("[tar.file] not found dir: " + user_src_dir + " \n")
    sys.stdout.write("[tar.file] end!! \n")

 

脚本运行

可以使用命令行运行,也可以使用 PyCharm Community Edition 2020.3 x64。

 

python mktar.py output

 

E:\Gitlab\realwatch_b\.gitlib-ci\venv\Scripts\python.exe E:/Gitlab/realwatch_b/.gitlib-ci/mktar.py app.js/360x360/rootfs
[tar.file] start!! 
[tar] source directory:app.js/360x360/rootfs
[tar.file] E:/Gitlab/realwatch_b/app.js/360x360/rootfs/system ==>E:/Gitlab/realwatch_b/app.js/360x360/rootfs/system.tar 
[tar.file] E:/Gitlab/realwatch_b/app.js/360x360/rootfs/user ==>E:/Gitlab/realwatch_b/app.js/360x360/rootfs/user.tar 
[tar.file] end!! 

Process finished with exit code 0

 

 

 

 

打包的文件

 

 

 

总结

  • 多使用python这样的脚本,快捷的解决问题。
  • 多总结一些常用的功能,用于以后的开发。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张世争

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值