• python复制多层目录下的文件至其他盘符对应的目录中


    一、需求

    app打包需要打入一些H5进去,以便更快的加载页面。这些H5文件是散落在各个文件夹中的【如下列所示】,偶尔各个文件夹还需新增文件,每次新增一个文件,需要改动jenkins上job脚本,比较麻烦,所以换一种思路来解决这个问题。

    tmp/
    ├── c
    │   ├── cmd.js.d
    │   ├── TZT2.0.js.d
    │   ├── TZT.js.d
    │   └── TZT346226207346241243350257264346230216.json.d
    ├── c_modules
    │   ├── config.js.d
    │   ├── css
    │   │   ├── base-min2.0.css.d
    │   │   ├── base-min.css.d
    │   │   ├── base-min-white.css.d
    │   │   ├── images
    │   │   │   └── arrow.png.d
    │   │   ├── jskj-elementUI.css.d
    │   │   ├── scroller.css.d
    │   │   ├── skin
    │   │   │   └── bg.css.d
    │   │   └── skin01
    │   │       └── bg.css.d
    │   ├── debuggap.js.d
    │   ├── fastclick.js.d
    │   ├── heatmap.min.js.d
    │   ├── jquery-1.7.1.min.js.d
    │   ├── jquery.min.js.d
    │   ├── loadData.js.d
    │   ├── loadSel.js.d
    │   ├── onscroll.js.d
    │   ├── pop
    │   │   ├── images
    │   │   │   └── icon_closeBtn.png.d
    │   │   ├── pop.css.d
    │   │   ├── pop.js.d
    │   │   ├── pop-zdycx.css.d
    │   │   └── pop-zdycx.js.d
    │   ├── proint.js.d
    │   ├── sea.js.d
    │   └── sensorsdata.min.js.d
    ├── config
    │   └── index.js.d
    ├── dist
    │   ├── src
    │   │   ├── common
    │   │   │   ├── iconClick.js.d
    │   │   │   └── md5.js.d
    │   │   ├── home
    │   │   │   ├── app.js.d
    │   │   │   ├── images
    │   │   │   │   ├── close.png.d
    │   │   │   │   ├── default.png.d
    │   │   │   │   ├── down.png.d
    │   │   │   │   ├── dxsq.png.d
    │   │   │   │   ├── fxng.png.d
    │   │   │   │   ├── gpcc.png.d
    │   │   │   │   ├── gpkh.png.d
    │   │   │   │   ├── guide1.png.d
    │   │   │   │   ├── guide2.png.d
    │   │   │   │   ├── guide3.png.d
    │   │   │   │   ├── guide4.png.d
    │   │   │   │   ├── header_bg.png.d
    │   │   │   │   ├── jftoast.png.d
    │   │   │   │   ├── mid_xgsgts.png.d
    │   │   │   │   ├── myzc.png.d
    │   │   │   │   ├── new.png.d
    │   │   │   │   ├── news.png.d
    │   │   │   │   ├── nodata.png.d
    │   │   │   │   ├── oper_activity_pop.png.d
    │   │   │   │   ├── register_tel.png.d
    │   │   │   │   ├── right.png.d
    │   │   │   │   ├── rmzt_one.png.d
    │   │   │   │   ├── rmzt_three.png.d
    │   │   │   │   ├── rmzt_two.png.d
    │   │   │   │   ├── selected.png.d
    │   │   │   │   ├── select.png.d
    │   │   │   │   ├── shadow.png.d
    │   │   │   │   ├── tougu_bg.png.d
    │   │   │   │   ├── up.png.d
    │   │   │   │   ├── user.png.d
    │   │   │   │   ├── voice.gif.d
    │   │   │   │   ├── yszb.png.d
    │   │   │   │   └── ywbl.png.d
    │   │   │   ├── index.html.d
    │   │   │   ├── js
    │   │   │   │   ├── home_index.js.d
    │   │   │   │   └── Sortable.js.d
    │   │   │   ├── routes
    │   │   │   │   └── routes.js.d
    │   │   │   ├── skin01
    │   │   │   │   └── home_index.css.d
    │   │   │   └── template
    │   │   │       └── home_index.html.d
    │   │   ├── mine
    │   │   │   ├── api
    │   │   │   │   └── function.js.d
    │   │   │   ├── app.js.d
    │   │   │   ├── css
    │   │   │   │   └── index.css.d
    │   │   │   ├── img
    │   │   │   │   ├── arrow_account.png.d
    │   │   │   │   ├── cao.png.d
    │   │   │   │   ├── common_used.png.d
    │   │   │   │   ├── crown.png.d
    │   │   │   │   ├── detail.png.d
    │   │   │   │   ├── dui.png.d
    │   │   │   │   ├── flow.png.d
    │   │   │   │   ├── guide1.png.d
    │   │   │   │   ├── guide2.png.d
    │   │   │   │   ├── guide3.png.d
    │   │   │   │   ├── guide4.png.d
    │   │   │   │   ├── guide5.png.d
    │   │   │   │   ├── hide_assets.png.d
    │   │   │   │   ├── jcsc.png.d
    │   │   │   │   ├── ka.png.d
    │   │   │   │   ├── not_login.png.d
    │   │   │   │   ├── show_assets.png.d
    │   │   │   │   ├── sign.png.d
    │   │   │   │   ├── transfer_accounts.png.d
    │   │   │   │   ├── tui.png.d
    │   │   │   │   ├── vip_arrow.png.d
    │   │   │   │   ├── vip.png.d
    │   │   │   │   ├── wei.png.d
    │   │   │   │   └── wen.png.d
    │   │   │   ├── index.html.d
    │   │   │   ├── js
    │   │   │   │   └── index.js.d
    │   │   │   ├── routes
    │   │   │   │   └── routes.js.d
    │   │   │   ├── skin
    │   │   │   │   └── index.css.d
    │   │   │   ├── skin01
    │   │   │   │   └── index.css.d
    │   │   │   └── template
    │   │   │       └── index.html.d
    │   │   └── public-images
    │   │       ├── cccb.png.d
    │   │       ├── dkxh.png.d
    │   │       ├── dpjl.png.d
    │   │       ├── dtzq.png.d
    │   │       ├── dxsq.png.d
    │   │       ├── dzjy.png.d
    │   │       ├── fhsp.png.d
    │   │       ├── fxng.png.d
    │   │       ├── fxspg.png.d
    │   │       ├── gdrs.png.d
    │   │       ├── ggcg.png.d
    │   │       ├── ggtjy.png.d
    │   │       ├── ggt.png.d
    │   │       ├── gpcc.png.d
    │   │       ├── gpkh.png.d
    │   │       ├── gpqq.png.d
    │   │       ├── gsrl.png.d
    │   │       ├── gszx.png.d
    │   │       ├── gznhg.png.d
    │   │       ├── jcsc.png.d
    │   │       ├── jfsc.png.d
    │   │       ├── jgdy.png.d
    │   │       ├── jjzt.png.d
    │   │       ├── lcsc_new.png.d
    │   │       ├── lhb.png.d
    │   │       ├── mfjg.png.d
    │   │       ├── myzc.png.d
    │   │       ├── nrzt.png.d
    │   │       ├── qbfw.png.d
    │   │       ├── rmzt.png.d
    │   │       ├── rzrq.png.d
    │   │       ├── sczd.png.d
    │   │       ├── sjjj.png.d
    │   │       ├── ssnc.png.d
    │   │       ├── tfp.png.d
    │   │       ├── tgsq.png.d
    │   │       ├── xsjj.png.d
    │   │       ├── xskx.png.d
    │   │       ├── xyjy.png.d
    │   │       ├── yjyg.png.d
    │   │       ├── ywbl_old.png.d
    │   │       ├── ywbl.png.d
    │   │       ├── yzzz.png.d
    │   │       ├── zlcc.png.d
    │   │       ├── znxg.png.d
    │   │       ├── znyj.png.d
    │   │       └── znzg.png.d
    │   └── static
    │       ├── css
    │       │   ├── base.css.d
    │       │   ├── base-min.css.d
    │       │   ├── base-min-sea-vue.css.d
    │       │   ├── mobiscroll.custom-2.6.2.min.css.d
    │       │   └── swiper.css.d
    │       ├── jquery
    │       │   ├── jquery-1.11.3.min.js.d
    │       │   ├── jquery-1.8.3.min.js.d
    │       │   └── jquery-range.js.d
    │       ├── lib
    │       │   ├── action.js.d
    │       │   ├── flexible.js.d
    │       │   ├── mobiscroll.custom-2.6.2.min.js.d
    │       │   └── swiper.js.d
    │       ├── sea
    │       │   ├── sea.js.d
    │       │   └── seajs-text.js.d
    │       └── vue
    │           ├── vue.js.d
    │           ├── vue-router.min.js.d
    │           ├── vue-scroller.min.js.d
    │           └── vue-scroller.min.js.map.d
    ├── frontend_7_06_js_test_0303.7z
    └── jy
        └── ggqq
            ├── function
            │   └── function.js.d
            ├── ggqq_index.html.d
            ├── image
            │   ├── add.png.d
            │   ├── delete.png.d
            │   ├── drcj.png.d
            │   ├── fall.png.d
            │   ├── ggqq_chicang.png.d
            │   ├── ggqq_cljy.png.d
            │   ├── ggqq_index_b.png.d
            │   ├── ggqq_index.png.d
            │   ├── ggqq_kcwt.png.d
            │   ├── ggqq_ksxd.png.d
            │   ├── ggqq_minus.png.d
            │   ├── ggqq_nologin.png.d
            │   ├── ggqq_plus.png.d
            │   ├── ggqq_sybg.png.d
            │   ├── ggqq_xq.png.d
            │   ├── gou.png.d
            │   ├── kcwt.png.d
            │   ├── loading.gif.d
            │   ├── minus.png.d
            │   ├── mymoney.png.d
            │   ├── notselect.png.d
            │   ├── others@2x.png.d
            │   ├── reset.png.d
            │   ├── right2.png.d
            │   ├── right.png.d
            │   ├── rise.png.d
            │   ├── select.png.d
            │   ├── shoppingcar.png.d
            │   └── zhcl@2x.png.d
            ├── js
            │   └── ggqq_index.js.d
            ├── skin
            │   ├── bdq.css.d
            │   ├── chedan.css.d
            │   ├── ggqq_bdsx.css.d
            │   ├── ggqq_chicang.css.d
            │   ├── ggqq_edcx.css.d
            │   ├── ggqq_hylist.css.d
            │   ├── ggqq_hysx.css.d
            │   ├── ggqq_index.css.d
            │   ├── ggqq_notice.css.d
            │   ├── ggqq_qindex.css.d
            │   ├── ggqq_xq.css.d
            │   ├── ggqq_xycx.css.d
            │   ├── ggqq_xyxq.css.d
            │   ├── jsd.css.d
            │   ├── login_mesg.css.d
            │   ├── qchicang.css.d
            │   ├── revisepassword.css.d
            │   └── zjcc.css.d
            └── skin01
                ├── bdq.css.d
                ├── ggqq_bankcr.css.d
                ├── ggqq_bdsx.css.d
                ├── ggqq_chicang.css.d
                ├── ggqq_edcx.css.d
                ├── ggqq_hylist.css.d
                ├── ggqq_hysx.css.d
                ├── ggqq_index.css.d
                ├── ggqq_notice.css.d
                ├── ggqq_qindex.css.d
                ├── ggqq_xq.css.d
                ├── ggqq_xycx.css.d
                ├── ggqq_xyxq.css.d
                ├── jsd.css.d
                ├── login_mesg.css.d
                ├── revisepassword.css.d
                └── zjcc.css.d
    View Code

    二、思路

    让前端开发把需要打入app的H5文件放入D:scriptssrc目录上  --->  读取该目录下文件的绝对路径  --->  在workspace中寻找对应的文件 ---> 并将这些文件复制到新的目录中,进行7za打包

    python代码如下:

     1 #!/usr/bin/env python3
     2 #-*- coding:GBK -*-
     3 # author by Michael Ho
     4 # contact:rui.he@geekthings.com.cn
     5 import os, shutil
     6 
     7 def copy_app_H5_file(x_root, x_dir, src_dir, dst_dir):
     8     if os.path.exists(dst_dir):
     9         shutil.rmtree(dst_dir)
    10     for root, dirs, files in os.walk(x_root):
    11         for d_name in dirs:
    12             d_name = os.path.join(root, d_name).rstrip()
    13             d_dir = d_name.replace(x_dir, dst_dir)
    14             if not os.path.exists(d_dir):
    15                 os.makedirs(d_dir)
    16         for f_name in files:
    17             f_name = os.path.join(root, f_name).rstrip()            
    18             if(os.path.splitext(f_name)[1] == ".d"):
    19                 s_file = f_name.replace(x_dir, src_dir)
    20                 d_file = f_name.replace(x_dir, dst_dir)
    21                 shutil.copyfile(s_file, d_file)
    22                 # 判断复制是否成功
    23                 if(s_file.replace(src_dir, "") == d_file.replace(dst_dir, "")):
    24                     print(d_file + "->" + "拷贝成功")
    25                 else:
    26                     print("拷贝过程发生错误,请检查...")
    27 
    28 if __name__ == '__main__':
    29     # 上传的小包根目录,默认是d:scripts,不要去动它!!!
    30     x_root = "d:\scripts"
    31     
    32     # 小包目录,默认是src,需要把小包的文件放在一个叫src目录里面!!!
    33     x_dir = "d:\scripts\src"
    34     
    35     # 从gitlab上获取的目录
    36     src_dir = "d:\Jenkins\frontend_encrypt"
    37 
    38     # 需要复制到目标目录,一般对其目录进行打包
    39     dst_dir = "d:\Jenkins\H5_APP"
    40 
    41     copy_app_H5_file(x_root, x_dir, src_dir, dst_dir)

    三、说明

    1.在Jenkins客户端在Windows上,python编码格式要设定成    # -*- coding:GBK -*-  (笔者当时写的是 # -*- coding: utf-8 -*-)不然Jenkins会报以下错误

    SyntaxError: (unicode error) 'utf-8' codec can't decode byte 0xbf in position 0: invalid start byte

    2.python调系统级的接口不算太友好,个人认为没有批处理方便。如果整个文件夹复制的话,还是 xcopy  src_dir dst_dir /s /e /f方便,所以Jenkins上打包的脚本,笔者为了打包速度,Windows打包机采用batch+python【以上个人见解、水平有限】

  • 相关阅读:
    linux试题
    linux常用脚本
    nagios
    lvs/nginx/haproxy 负载均衡优缺点分析讲解
    一次SSLPeerUnverifiedException,SSLHandshakeException问题的分析
    [转]【安卓笔记】AsyncTask源码剖析
    linux下查看进程占用端口和端口占用进程命令
    which framework or library is best to use WebRTC
    [转]svn diff 替代工具
    [转]使用Subversion进行版本控制
  • 原文地址:https://www.cnblogs.com/herui1991/p/12403814.html
Copyright © 2020-2023  润新知