递归地同步/复制文件到不同的结构



我有给定的文件结构:

- 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目录中,如下所示:

- public/
- examplesite.com/
- file.css
- file.jpg
- anotherexamplesite.com/
- stuff.css
- things.jpg

并且将resources目录中的文件放入站点文件夹中,如下所示:

- sites/
- examplesite.com/
- resources/
- views/ 
- view.php

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

这就是我所拥有的:

#!/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命令运行良好,它将文件复制到sites目录中,没有问题,因为文件夹结构不需要更改。但是,第二个rsync命令执行以下操作:

- public/
- examplesite.com/
- public/
- file.css
- file.jpg
- anotherexamplesite.com/
- public/
- stuff.css
- things.jpg

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

有什么想法吗?

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

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
  • 确保目标目录存在
  • rsyncdev/public/

此代码段仅处理dev,因为您的resources示例已经在工作。

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

最新更新