将所有文件(递归地)从一个目录Rsync到另一个目录,仅保留原始目录结构的一部分

时间:2017-12-14 06:42:39

标签: gruntjs rsync

我有两个目录:

目录#1,'C'

C的绝对路径:

/A/B/C

目录#2,'T'

T的绝对路径:

/Q/R/T

我想使用 rsync ,以递归方式从 C 复制所有文件,然后将其复制到 T ,而维持原始目录结构 - ,但仅从B开始

让它更清晰的例子:假设'B'只有3个嵌套在其中的文件:

/A/B/f1.txt

/A/B/C/f2.txt

/A/B/C/D/f3.txt

然后我想最终只复制f2.txt和f3.txt,最终的文件路径如下(注意我如何保留目录结构,仅从B开始):

/Q/R/T/B/C/f2.txt

/Q/R/T/B/C/D/f3.txt

以下是捕获:我必须从/ Q / R / 中执行rsync cmd。所以当我执行这个命令时,我的pwd必须是/ Q / R /.

任何人都可以帮我弄清楚如何做到这一点吗?

[如果我没有这个我的cwd必须的约束,我可以cd到/ A / B,然后执行:rsync . /Q/R/T/ --recursive --relative。不幸的是,我不能这样做是因为这里需要做很多毫无意义的解释。当我尝试执行rsync /A/. /Q/R/T/ --recursive --relative时,我不仅最终得到A中的所有内容,而且还保留了我不想要的dir结构的第一部分(/ A /)。 (注意 - 在现实生活场景中,dir结构要比这复杂得多,这只是一般问题。]

1 个答案:

答案 0 :(得分:1)

rsync命令包含两个适用于此方案的选项。他们是:

  

--include=PATTERN - 不要排除与PATTERN匹配的文件

     

--exclude=PATTERN - 排除与PATTERN匹配的文件

可以找到--exclude标志的优秀说明和示例{。{3}}。

解决方案

考虑到问题中提供的目录结构,并且pwd设置为/Q/R/。运行以下命令将满足您的要求:

rsync ../../A/ T/ --recursive --include A/B/** --exclude B/*.*

修改

如果您确实希望将/A/B/f1.txt复制到/Q/R/T/B/f1.txt (因为您不会在" I中显示,因此您的问题不明确想结束"示例" )。然后省略--exclude B/*.*部分,因此完整命令将缩减为:

rsync ../../A/ T/ --recursive --include A/B/**

或复杂性进一步降低到:

rsync ../../A/** T/ --recursive

命令说明

<强> ../../A/

第一个参数提供 source 目录的路径。即名称​​的层次树中的相对位置(基于您的pwd/Q/R

<强> T/

第二个参数提供 destination 目录的路径。同样,这是名称​​的层次树中的相对位置(并且也基于pwd/Q/R

<强> --recursive

第一个选项是递归目录。

<强> --include A/B/**

这表示您希望包含所有资产(文件/文件夹),无论多深层,都位于名为B的文件夹中,该文件夹位于文件夹A

<强> --exclude B/*.*

这表示您希望排除任何资产(文件/文件夹),其名称包含一个点[.]加上扩展名,它位于文件夹B < em>(在顶层)。这将阻止复制名为f1.txt的文件。你可以在这里更具体一点,而不是使用--exclude B/f1.txt,但是我在现实生活中假设你可能还有其他想要在这里排除的文件。

附加说明

--include--exclude选项都可以多次使用。这对某些场景非常有用,因为它使您能够具体了解在复制过程中要包含和/或排除的内容。

例如,假设您的源目录/A/B/(如您的问题中所述),还包含名为X的文件夹。所以它的路径是A/B/X

假设我们也不想复制名为X 的文件夹(与您目前不想复制/A/B/f1.txt的方式相同)

对于这种情况,我们添加另一个--exclude选项,如下所示:

rsync ../../A/ T/ --recursive --include A/B/** --exclude B/*.* --exclude X/

请注意最后的其他--exclude X/

你提到......

  

(注意 - 在现实生活场景中,dir结构比这复杂得多,这只是一般问题。

...在您的问题中,您可能会发现有必要添加其他 --exclude=PATTERN 以真正满足您的要求。

咕噜

由于您在问题中包含了gruntjs标记,因此您可能需要考虑使用可以运行rsync等shell命令的插件,例如: