我想将源的一部分复制到目的地:
SRC_DIR=/a/b/c/d/e
DEST_DIR=/x/y/z/d/e
当我的脚本启动时,我在以下位置创建所有文件夹$DEST_DIR
:
mkdir -pv /x/y/z/d/e
我有一个来自源的相对路径列表,它们是e
我要复制的第一个子路径。该列表是根据 find 命令的输出构建的,如下所示:
/USER_CONFIG_COPY/G731GV/REAL/2023_06_17_22h11/user_install/root
....
....
/002_DATA/SSH/2023_09_01.prev/root
....
....
....
/002_DATA/USER_CONFIG_INITIAL/root
....
....
....
....
/001_SCRIPTS/000_TOOLS/root
....
....
为了构建包含列表,我首先放置父文件夹,然后放置从查找输出获取的列表。所以列表看起来像这样:
/a
/a/b
/a/b/c
/a/b/c/d
/a/b/c/d/e
/USER_CONFIG_COPY/G731GV/REAL/2023_06_17_22h11/user_install/root
....
....
/002_DATA/SSH/2023_09_01.prev/root
....
最终的命令是:
rsync -arzh -vvv --include='/tmp/000_my_include_root_dirlist.txt' --exclude='*' "$SRC_DIR/" "$DST_DIR/"
我尝试了 U&L Stack Exchange 上找到的许多技巧,但没有成功。我究竟做错了什么?
好吧,克里斯的建议适用于一小部分文件夹。我的问题来自于缺少 --recursive 选项和在文件夹上使用粘性位的问题。我要做一个完整的测试。我尽快发布消息。
答案1
您的选项--include='/tmp/000_my_include_root_dirlist.txt'
包括文件"$SRC_DIR/tmp/000_my_include_root_dirlist.txt"
,而不是其内容。你可能想要--files-from
并且既不--include
也不--exclude
:
rsync --dry-run -ah -vv --files-from='/tmp/000_my_include_root_dirlist.txt' "$SRC_DIR/" "$DST_DIR"
现在从文件列表中删除第一组/a
到 ,并确保列出的文件的其余部分具有相对于 的路径,每行一个。例如代表./a/b/c/d/e
$SRC_DIR
/my_file.txt
"$SRC_DIR/my_file.txt"
我已经添加了--dry-run
,这样rsync
只会向您展示它会做什么。当您准备好执行该选项时,请删除该选项。我还删除了多余的内容,-r
因为它是 的一部分-a
,并且-z
因为在本地复制时它毫无意义。
我也有点困惑为什么你似乎想要生成一个要复制的文件列表,而rsync
自己可以做到这一点。 (也许您还应用了一些其他标准find
来限制文件集?)
答案2
如果,正如您所说,USER_CONFIG_COPY
、002_DATA
和001_SCRIPTS
是 的子目录 e
,那么您不应该放在/
它们前面(例如, /USER_CONFIG_COPY
)。 “ /USER_CONFIG_COPY
”表示该 USER_CONFIG_COPY
目录下根目录。
如果您cd
运行/a/b/c/d/e
并运行find
,您将得到如下所示的输出
./USER_CONFIG_COPY/G731GV/REAL/2023_06_17_22h11/user_install/root
︙
︙
︙
./002_DATA/SSH/2023_09_01.prev/root
︙
︙
︙
这 .
开头的s不是装饰;你不能就这样不管它们。它们表明路径是相对于.
,当前目录(即/a/b/c/d/e
)。
同样,如果您运行,您将得到如下所示的输出find "$SRC_DIR/" criteria
/a/b/c/d/e/USER_CONFIG_COPY/G731GV/REAL/2023_06_17_22h11/user_install/root
︙
︙
︙
/a/b/c/d/e/002_DATA/SSH/2023_09_01.prev/root
︙
︙
︙
如果您将其通过管道传输sed 's#^'$PATH_INCLUDE_FROM'##'
,假设$PATH_INCLUDE_FROM
是/a/b/c/d/e
,那么您还将获得您显示的输出。这同样是错误的。如果要引用,放在一行和 下一行/a/b/c/d/e/USER_CONFIG_COPY/...
是不正确的。每行必须是有效的文件名。/a/b/c/d/e
/USER_CONFIG_COPY/...
顺便一提,
- 为什么有两个变量(
SRC_DIR
和PATH_INCLUDE_FROM
)来引用同一个目录? 's#^'$PATH_INCLUDE_FROM'##'
语法错误。请改用"s#^$PATH_INCLUDE_FROM##"
(带双引号"
)。