我想将源的一部分复制到目的地:
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 选项和在文件夹上使用粘性位的问题。我要做一个完整的测试。我尽快发布消息。
您的选项
--include='/tmp/000_my_include_root_dirlist.txt'
包括文件"$SRC_DIR/tmp/000_my_include_root_dirlist.txt"
,而不是其内容。你可能想要--files-from
并且既不--include
也不--exclude
:现在从文件列表中删除第一组
/a
到,并确保列出的文件的其余部分具有相对于 的路径,每行一个。例如代表./a/b/c/d/e
$SRC_DIR
/my_file.txt
"$SRC_DIR/my_file.txt"
我已经添加了
--dry-run
,这样rsync
只会向您展示它会做什么。当您准备好执行该选项时,请删除该选项。我还删除了多余的内容,-r
因为它是 的一部分-a
,并且-z
因为在本地复制时它毫无意义。我也有点困惑为什么你似乎想要生成一个要复制的文件列表,而
rsync
自己可以做到这一点。(也许您还应用了一些其他标准来find
限制文件集?)如果,正如您所说,
USER_CONFIG_COPY
、002_DATA
和001_SCRIPTS
是 的子目录e
,那么您不应该放在/
它们前面(例如,/USER_CONFIG_COPY
)。“/USER_CONFIG_COPY
”表示 根USER_CONFIG_COPY
目录下的目录。如果您
cd
运行/a/b/c/d/e
并运行find
,您将得到如下所示的输出.
开头的s不是装饰; 你不能就这样不管它们。它们指示路径相对于.
当前目录(即/a/b/c/d/e
)。同样,如果您运行,您将得到如下所示的输出
find "$SRC_DIR/" criteria
如果您将其通过管道传输
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##"
(带双引号,"
) 代替。