递归 Rsync/copy 个文件到不同的结构
Recursively Rsync/copy files to different structure
我有给定的文件结构:
- 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
目录中,如下所示:
- public/
- examplesite.com/
- file.css
- file.jpg
- anotherexamplesite.com/
- stuff.css
- things.jpg
然后将 resources
目录中的文件放入 sites 文件夹,如下所示:
- sites/
- examplesite.com/
- resources/
- views/
- view.php
基本上是将每个站点中public目录的内容复制到一个目录上,然后将该父目录同步到public
目录。并将资源目录直接复制到站点目录中。我有第二部分工作,但第一部分工作不正常:
这是我的:
#!/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 命令执行以下操作:
- public/
- examplesite.com/
- public/
- file.css
- file.jpg
- anotherexamplesite.com/
- public/
- stuff.css
- things.jpg
我不太确定如何轻松地将文件递归复制到正确的站点文件夹中,同时将目标文件移出它们的 public 目录,并向上移动一个目录,以便它们直接位于站点名称。
有什么想法吗?
您可以将一些 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
- 确保目标目录存在
rsync
从 dev/
到 public/
此代码段仅处理 dev
,因为您的 resources
示例已经在运行。
如果您希望 rsync
也从目的地删除不再存在的文件,您可以添加标记 --delete
。
我有给定的文件结构:
- 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
目录中,如下所示:
- public/
- examplesite.com/
- file.css
- file.jpg
- anotherexamplesite.com/
- stuff.css
- things.jpg
然后将 resources
目录中的文件放入 sites 文件夹,如下所示:
- sites/
- examplesite.com/
- resources/
- views/
- view.php
基本上是将每个站点中public目录的内容复制到一个目录上,然后将该父目录同步到public
目录。并将资源目录直接复制到站点目录中。我有第二部分工作,但第一部分工作不正常:
这是我的:
#!/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 命令执行以下操作:
- public/
- examplesite.com/
- public/
- file.css
- file.jpg
- anotherexamplesite.com/
- public/
- stuff.css
- things.jpg
我不太确定如何轻松地将文件递归复制到正确的站点文件夹中,同时将目标文件移出它们的 public 目录,并向上移动一个目录,以便它们直接位于站点名称。
有什么想法吗?
您可以将一些 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
- 确保目标目录存在
rsync
从dev/
到public/
此代码段仅处理 dev
,因为您的 resources
示例已经在运行。
如果您希望 rsync
也从目的地删除不再存在的文件,您可以添加标记 --delete
。