关于bash:递归Rsync / copy文件到不同的结构

Recursively Rsync/copy files to different structure

我有给定的文件结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
- dev/
   - examplesite.com/
     - public/
       - file.css
       - file.jpg
  - anotherexamplesite.com/
     - public/
       - stuff.css
       - things.jpg
     - resources/
       - views/
         - view.php
- public/
  - examplesite.com/
    - somefile.txt
- sites/
  - examplesite.com/

我想将dev目录中每个站点文件夹的公用目录中的所有文件同步到上面的public目录中,如下所示:

1
2
3
4
5
6
7
- public/
   - examplesite.com/
     - file.css
     - file.jpg
   - anotherexamplesite.com/
     - stuff.css
     - things.jpg

resources目录中的文件放入sites文件夹,如下所示:

1
2
3
4
5
- sites/
     - examplesite.com/
       - resources/
          - views/
            - view.php

基本上将每个站点中的公共目录的内容复制到一个目录中,然后将父目录同步到public目录。并将资源目录直接复制到站点目录中。我有第二部分工作,但第一部分工作不正常:

这就是我所拥有的:

1
2
3
4
5
#!/usr/bin/env bash
MY_PATH="/var/www"

rsync --exclude='.git/'"$MY_PATH/dev/""$MY_PATH/sites/" --recursive
rsync --exclude='.git/' --exclude='resources/'"$MY_PATH/dev/public""$MY_PATH/public/" --recursive

这个脚本的第一个rsync命令工作正常,它可以将文件复制到站点目录中,而不会发出任何问题,因为文件夹结构不需要更改。但是,第二个rsync命令执行以下操作:

1
2
3
4
5
6
7
8
9
- public/
   - examplesite.com/
     - public/
        - file.css
        - file.jpg
   - anotherexamplesite.com/
     - public/
       - stuff.css
       - things.jpg

我真的不知道如何轻松地将文件递归复制到正确的站点文件夹中,同时也将目标文件移出其公用目录,并向上移动一个目录,以便它们直接位于站点名下。

有什么想法吗?


您可以将一些bash代码与rsync混合,例如(未测试,只是为了给您一个想法):

1
2
3
4
5
for site in $MY_PATH/dev/*; do
  dist="$MY_PATH/public/$(basename"$site")"
  mkdir -p"$dist"
  rsync -r --exclude='.git/'"$site/public/""$dist/"
done

这将:

  • 遍历dev/中的站点
  • 确定目的地并将其存储在变量dist中。
  • 确保目标目录存在
  • dev/public/rsync

这段代码只处理dev,因为您的resources示例已经开始工作了。

如果希望rsync也从不再存在的目的地删除文件,可以添加标志--delete