RSYNC 在使用选项 --include=file 时不复制任何内容

RSYNC 在使用选项 --include=file 时不复制任何内容

我想将源的一​​部分复制到目的地:

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_COPY002_DATA001_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_DIRPATH_INCLUDE_FROM)来引用同一个目录?
  • 's#^'$PATH_INCLUDE_FROM'##'语法错误。请改用"s#^$PATH_INCLUDE_FROM##"(带双引号")。

相关内容