代码之家  ›  专栏  ›  技术社区  ›  user1790300

将文件夹(包括子文件夹)的全部内容复制到目标

  •  0
  • user1790300  · 技术社区  · 6 年前

    我正在使用ansible将.js文件从本地计算机移动到ec2开发环境中,并且在复制整个文件夹结构时遇到问题。

    我正在使用以下任务移动文件,并且似乎遇到了一个问题,只有直接位于dist文件夹中的文件才会被复制。我需要将整个文件夹(包括子文件和文件夹)复制到目标文件夹。

    - name: Copy each file over that matches the given pattern
        copy:
          src: "{{ item }}"
          dest: "/home/admin/microservice/dist"
          owner: "admin"
          group: "admin"
          force: "yes"
          recurse: "true"
          mode: 0755
        with_fileglob:
          - "/Users/myfolder/WebStormProjects/project/microservice/dist/*.js"
    

    我需要将整个文件夹内容从源复制到目标,包括子文件夹和文件?我能做些什么来修复这个任务使之发生?

    2 回复  |  直到 6 年前
        1
  •  1
  •   techraf    6 年前

    copy 模块,问题的解决方案比您想象的要复杂得多,因为:

    • 你不能匹配目录并且 *.js 一次全局搜索操作中的文件,

    • 即使可以,也不能使用相同的“复制”操作来复制文件和创建目录(注意:创建目录,而不是复制!因为后者意味着复制所有文件)。

    您需要分别处理目录和文件(请参见 first revision of this answer )中。


    rsync ,解决方案要简洁得多,只需要设置适当的过滤器 --include='*/' --include='*.js' --exclude='*' 是的。

    这个 synchronize 在Ansible中实现此功能的任务:

    - synchronize:
        src: /source/Users/myfolder/WebStormProjects/project/microservice/dist/
        dest: /home/admin/microservice/dist/
        rsync_opts:
          - --include=*/
          - --include=*.js
          - --exclude=*
    

    注意1:在 rsync_opts 是的。

    注意2:您可能仍然需要设置适当的所有权和权限。

        2
  •  0
  •   Random_Automation    6 年前

    首先在这里使用copy module不太理想,因为“复制模块递归复制工具不能扩展到成百上千个文件。有关替代方案,请参见 synchronize 模块,它是rsync的包装器。”

    copy module documentation

    synchonize module documentation

    但是,您可以使用复制模块执行以下操作:

       copy:
           src: "{{ item }}"
           dest: /home/admin/microservice/dist
       with_lines: "find /home/admin/microservice/dist -type f -name *.js "
    

    类似地,您可以尝试使用“同步”模块,如下所示:

      synchronize:
            src: "{{ item }}"
            dest: /home/admin/microservice/dist
       with_lines: "find /home/admin/microservice/dist -type f -name *.js "
    

    如果要保留目录布局,可以执行以下操作:

    在步骤1=>中,您将把父目录结构中所需的模式文件复制到临时目录中。

    step2=>然后需要将临时目录复制到目标目录中。在wards之后,您可以删除temp目录或任何您的用例。

    - name: copy pattern files and directory into a temp directory shell: find . -type f -name "*.js" | cpio -pvdmB /temp/dir/ args: chdir: "/Users/myfolder/WebStormProjects/project/microservice/dist/" - name: Copy the temp directory recursively to destination directory copy: src: "/temp/dir/" dest: "/home/admin/microservice/dist/" owner: "admin" group: "admin" force: "yes" mode: 0755