如何修正find+rsync命令,仅复制archive目录下的指定内容?
问题:rsync迁移文件时如何排除父目录仅复制子内容
目录结构与迁移要求
源目录结构
-var -data -archive -111111 -logs datetime.log meter.txt -222222 -logs datetime.log meter.txt -configurations -rules config.json -recycle
迁移条件
- 仅复制修改时间≤30天的文件/目录(
configurations目录不受此限制,需复制其所有内容); - 排除
recycle目录; - 仅复制
archive下的内容,不复制var、data和archive本身。
目标目录结构
-target -111111 -logs datetime.log meter.txt -222222 -logs datetime.log meter.txt -configurations -rules config.json
当前问题
使用以下命令时,已实现前两个条件,但无法排除var/data/archive目录,导致target下会出现多余的父目录层级:
find var/data/archive ! -path "*/recycle*" \( -path "*/configurations*" -o -name "*" -mtime -30 \) | rsync -av --inplace --files-from=- . target
修正方案
修正后的命令
find var/data/archive ! -path "*/recycle*" \( -path "*/configurations*" -o -mtime -30 \) -printf "%P\n" | rsync -av --inplace --files-from=- var/data/archive/ target/
关键调整说明
- 去掉父目录路径前缀:给
find添加-printf "%P\n"参数,让它输出相对于var/data/archive的路径,而非完整路径,这样rsync就不会把var/data/archive层级带到目标目录。 - 调整rsync的源目录:将rsync的源从
.改为var/data/archive/,确保rsync从正确的起始目录读取要复制的文件/目录。 - 移除冗余参数:删掉原命令中多余的
-name "*",因为find默认会匹配所有符合条件的文件/目录。
验证效果
- 所有符合时间条件的
111111、222222目录内容会被复制到target下; configurations目录的所有内容不受时间限制,完整复制;recycle目录被排除;- target下不会出现
var、data、archive这些父目录层级,完全符合目标结构要求。
内容的提问来源于stack exchange,提问作者ima.technophyle
相关产品推荐
相关产品推荐

