📌 背景规则
rsync 的匹配逻辑是:
-
遍历目录时,如果某个目录被排除了,它下面的文件/目录就不会再被扫描。
-
所以如果你只写
--include='uploads/***'
,但没有告诉 rsync 要“保留进入 uploads 目录”,那 rsync 可能根本不会进入这个目录。 -
因此要写两个 include:
--include='uploads/'
→ 允许进入uploads
目录本身--include='uploads/***'
→ 允许uploads
目录下的所有内容
✅ --include
推荐写法
如果是“排除其它,只保留 uploads”,写法通常是:
rsync -av --delete \
--include 'uploads/' \
--include='uploads/***' \
--exclude='*'
--dry-run \
/mnt/hgfs/e/phpstudy_pro/WWW/project_dev/ \
/mnt/hgfs/e/phpstudy_pro/WWW/project/
🚀 意思是:
- 允许
uploads/
目录和里面的所有内容 - 其他一律排除
✅ --exclude
推荐写法
如果你想完全排除 .git,推荐写法:
rsync -av --delete \
--exclude '.git/' \
--dry-run \
/mnt/hgfs/e/phpstudy_pro/WWW/project_dev/ \
/mnt/hgfs/e/phpstudy_pro/WWW/project/
🚀 这样 rsync 会直接忽略整个 .git
目录。
✅ 排除指定后缀文件
--exclude '*.dev.php'
🚀 这个规则会匹配 任意目录层级 下的 *.dev.php
文件。
也就是说:
/mnt/hgfs/e/phpstudy_pro/WWW/project_dev/a.dev.php
❌ 不会同步/mnt/hgfs/e/phpstudy_pro/WWW/project_dev/b/a.dev.php
❌ 不会同步/mnt/hgfs/e/phpstudy_pro/WWW/project_dev/b/c/d/a.dev.php
❌ 不会同步
只要文件名以 .dev.php
结尾,无论在多少层目录里,都会被排除。
rsync -av --delete \
--exclude '.git/' \
--exclude '.idea/' \
--exclude 'softs/' \
--exclude 'docs/' \
--exclude 'uploads/' \
--exclude '*.dev.php' \
--dry-run \
/mnt/hgfs/e/phpstudy_pro/WWW/project_dev/ \
/mnt/hgfs/e/phpstudy_pro/WWW/project/