我正在尝试将rsync
文件从一个目录复制incoming
到一个名为 的目录outgoing
,即
/testcopy/folder1/incoming/test1.txt
到
/testdest/folder1/outgoing/
目录来源:
/testcopy/folder1/incoming/test1.txt
/testcopy/folder1/incoming/test2.txt
/testcopy/folder2/incoming/test1.txt
/testcopy/folder2/incoming/test2.txt
/testcopy/folder3/incoming/test1.txt
/testcopy/folder3/incoming/test2.txt
目录目的地:
/testdest/folder1/outgoing/
/testdest/folder2/outgoing/
/testdest/folder3/outgoing/
我想要的目的地是什么样子的:
/testdest/folder1/outgoing/test1.txt
/testdest/folder1/outgoing/test2.txt
/testdest/folder2/outgoing/test1.txt
/testdest/folder2/outgoing/test2.txt
/testdest/folder3/outgoing/test1.txt
/testdest/folder3/outgoing/test2.txt
我尝试过的脚本rsync
:
touch /testcopy/folder3/incoming/test4.txt
我期望看到的是test4.txt
以下文件/testdest/folder3/outgoing/
# rsync -av /testcopy/*/incoming/* /testdest/*/outgoing/
sending incremental file list
sent 520 bytes received 12 bytes 1,064.00 bytes/sec
total size is 0 speedup is 0.00
我已经尝试了上述脚本的几个不同的迭代,但似乎无法正确执行。
答案1
rsync
不允许重写源和目标之间的路径。
rsync
您可以做的是为每个/testcopy/*/incoming
目录调用一次:
for srcdir in /testcopy/*/incoming/; do
[ ! -d "$srcdir" ] && break
destdir=/testdest/${srcdir#/testcopy/} # replace /testcopy/ with /testdest/
destdir=${destdir%/incoming/}/outgoing/ # replace /incoming/ with /outgoing/
mkdir -p "$destdir" &&
rsync -av "$srcdir" "$destdir"
done
对于每个目录,通过将路径前缀替换为并将路径后缀替换为 来incoming
构建目标路径。这是使用两个标准参数替换来完成的。/testcopy/
/testdest/
/incoming/
/outgoing/
该循环还会创建目标目录,以防万一它尚不存在。
[ ! -d "$srcdir" ] && break
循环开始处的 可以确保,如果模式与任何内容都不匹配,则不会运行mkdir
and rsync
(默认情况下,shell 会保持模式不展开,除非您位于 中zsh
)。在 中bash
,您可能想shopt -s nullglob
在循环之前使用。