linux将文件夹打包为.tar,linux tar命令打包整个文件夹详解
问题说明平台:windows1064位
eftar_pak(out_filename,source _ dir):ifno tos。路径。exists(source _ dir)3360 sysstdout。写) w )astar:tar。add)source _ dir,OS.path.basename ) source.dir,OS.path.basename ) ) sou
使用python 3.7 tar文件水手打包时,发现生成的水手包是正常的。
但是,更换python3.9后,找到打包的文件,解压缩后有@PaxHeader文件。
查看水手包时,多了一个。目录。在Linux操作系统操作系统上,通常当前目录为【.】,上级目录为【.】。
python 3.9打出的水手包中包含【本地磁盘】的【.】目录!
我想删除这个。目录。如果不删除,嵌入式软件解压缩将失败。开始网络搜索,发现大家都没遇到过这个问题!
查看python tarfile,没有发现任何问题。
干脆进入目标文件的源文件,找出python3.7和python3.9之间的区别。
终于发现了问题:
python 3.7
默认格式=GNU格式
python 3.9
DEFAULT_FORMAT=PAX_FORMAT
两个版本的包的默认格式不同!
解决方法1 :
:C:Python39Libtarfile.py中的:
将DEFAULT_FORMAT=PAX_FORMAT更改为默认格式=GNU格式。
测试表明没问题。这可能是由于窗子平台和Linux操作系统操作系统平台之间的差异,Linux平台的当前目录【.】和上级目录【.】较多。如果tarfile.add函数是递归打包的,则当前目录【.】也包含在水手包中。
:使用默认格式=GNU格式可以解决此问题。
【我不推荐你改变那么多。你可以用第二种方法!】
解决方法2 :
使用目标文件打开后,设置格式目标文件.GNU_FORMAT
tar.format=tarfile .GNU_FORMAT
ef make _ tar _ package(out _ filename,source_dir,tar _ type):ifnotos。路径。exists)source _ dir 3365292;tar _ type)astar:tar。格式=tar文件.GNU _ format # format tat OS。路径。basename(source _ dir))deftar _ pak n (returnwithtarfile)。open(out _ filename, w ) astar : tar.format=tarfile .GNU _ format # format tar.ar)
importsimportsysimporttarfiletar _ system _ dir _ name= system tar _ user _ dir _ name= user tar _ default _ tar _ type(:ifno tos。路径。exists(source _ dir)3360 sysstdout。写([tar。err]sourcer n )tar _ type)astar:tar。格式=tar文件.GNU _ format tar。添加操作系统。路径。basename(source _ dir))deftar _ pak n (returnwithtarfile)。open(out _ filename, w ) astar : tar.format=tarfile .GNU _ format tar。添加)酸mat OS。路径。基本名称(源目录))高级路径定义获取获取(/) ) )当前路径def获取当前路径):返回os.getcwd).替换(()、(/)main函数条目if _ _ n ) #文件夹初始化iflen(系统。argv)=2:_ source _ dir=sys。argv[1]sys。stdout。write([tar]sourcedirectorectore n )if len(sys。argv)=3:_ tar _ format= w: sys。argv[2]sys。stdout。write()tartype 33333= :system _ src _ dir=OS。路径。join(get _ current _ path),)_ source _ dir(/ tar _ sth)/)system _ tar _ filename=OS。路径.重播我/(user _ src _ dir=OS。路径。join(获取当前路径),tar用户目录名.replace())))652 tar _ system _ dir _ name tar _ default _ type).替换))用户_焦油_文件名=操作系统。路径。join ame tar _ user _ dir _ name tar _ default _ type).替换(()、())ifos。路径。exists)system _ src _ dir system _ src _ dir(sys。stdout。写([tar。file] system _ src _ dir)n)else:sys。stdout。写([tar。file]找不到目录: system _ src _ dir())。伊佛斯.路径。exists(user _ src _ dir):tar _ pak)user _ tar _ filename,user _ src _ dir(sys。stdou pak n )else:sys。stdout。写([tar。file]找不到目录: user _ src _ dir n ). sys。stdout。写) n’)效果
总结一下python的问题,在版本对比中,可以通过查python API手册找到更深入的分析方法。