我有两个目录:
目录#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结构要比这复杂得多,这只是一般问题。]
答案 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命令的插件,例如: