【问题标题】:Copying entire contents of folder including subfolders to destination将文件夹的全部内容(包括子文件夹)复制到目标
【发布时间】:2018-07-12 21:17:12
【问题描述】:

我正在使用 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"

我需要将整个文件夹内容从源复制到目标,包括子文件夹和文件?我可以做些什么来解决此任务以实现此目的?

【问题讨论】:

标签: ansible


【解决方案1】:

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

  • 您无法在单个 globbing 操作中匹配目录和 *.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】:

    在这里首先使用复制模块不应该是理想的,因为“复制模块递归复制工具不能扩展到大量(>数百)文件。有关替代方案,请参阅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=>然后你需要将临时目录复制到目的地。之后,您可以删除临时目录或任何您的用例。

    - 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

    【讨论】:

    • 这也是复制文件夹的原因吗?
    • 在我的示例中,它仅将模式文件从源目录递归复制到目标。它不应对目录结构。如果要复制目录结构,则必须根据需要优化命令或剧本。
    • 我现在正在运行它。这很接近。我确实注意到它只是复制文件而不是文件夹。我也对如何使其复制文件夹持空白。
    • 我已经编辑了我的答案,如何在保留父目录结构布局的同时执行。
    猜你喜欢
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 2020-05-01
    • 2019-10-12
    • 1970-01-01
    • 2017-07-05
    相关资源
    最近更新 更多