Rsync 包含排除

Rsync 包含排除

我知道有十亿个这样的问题。但我确信我已经尝试了其中的很多方法,但我无法完成这项工作,所以请不要只是将其标记为重复

我有一个文件系统看起来像

1_counts/
|_________sample1/
          |__________boring_file1
          |__________boring_file2
          |__________boring_dir1/
                     |__________boring_file1
                     |__________boring_file2
          |__________dir/
                     |__________boring_file1
                     |__________boring_file2
                     |__________another_dir/
                                |__________file1
                                |__________file2
                                |__________file3
                                |__________boring_dir/
                                           |__________boring_file
                                |__________boring_file.RData

我有几个“样本”目录。

我需要在 上同步文件 1、2 和 3 another_dir/。我想保留文件结构(我在目标中没有子/目录),我只是不想复制所有内容。

我首先尝试将所有内容放在以下位置dir/another_dir

rsync -r -v --dry-run --include="dir/" \
--include="dir/another_dir/" \
--exclude="*" 1_counts/* .

这不会返回带有消息的任何文件[sender] hiding directory sample_1 because of pattern *。与相同

rsync -r -v --dry-run --include="dir/" \
--include="dir/another_dir/***" \
--exclude="*" 1_counts/* .

此选项(此处称为解决方案1) 检索了 中的所有内容dir/another_dir/

rsync -r -v --dry-run --include="dir/" \
--include="dir/another_dir/***" \
--exclude="*/*" 1_counts/* .

说实话,我猜到了。我不知道为什么我需要*/*排除。

如果我尝试

rsync -r -v --dry-run --include="dir/" \
--include="dir/another_dir/" \
--exclude="*/*" 1_counts/* .

我只得到dir/another_dir目录,而不是内容。正如预期的那样。

如果我这样做

rsync -r -v --dry-run --include="dir/" \
--include="dir/another_dir/*" \
--exclude="*/*" 1_counts/* .

我只得到dir/目录,没有内容。我想这也是预料之中的(第二个答案这里)但我很困惑为什么我another_dir也没有得到......一个谜。

反正,现在我可以使用解决方案 1 来复制 中的所有内容1_counts/sample1/dir/another_dir。现在我试图排除boring_file.RData 和dir/another_dir/boring_dir.

我试过

rsync -r -v --dry-run --include="dir/" \
--include="dir/another_dir/***" \
--exclude="*.RData" \
--exclude="boring_dir/" \
--exclude="*/*" 1_counts/* .

这是行不通的。一切仍然包括在内。我认为这与路径有关,所以我也尝试了

rsync -r -v --dry-run --include="dir/" \
--include="dir/another_dir/***" \
--exclude="dir/another_dir/*.RData" \
--exclude="dir/another_dir/boring_dir/" \
--exclude="*/*" 1_counts/* .

也不行。我已经没有选择了,我很困惑为什么其中的某些部分有效......

我非常感谢对此的任何意见。

答案1

此时您已经非常接近解决方案了:

rsync -r -v --dry-run --include="dir/" \
--include="dir/another_dir/***" \
--exclude="*.RData" \
--exclude="boring_dir/" \
--exclude="*/*" 1_counts/* .

事情是这样的rsync 使用第一个匹配模式,因此通过包含 下的所有内容another_dir,您可以有效地包含无聊的内容和 .RData 文件。您只需更改过滤规则的顺序:

rsync -r -v --dry-run --include="dir/" \
--exclude="*.RData" \
--exclude="boring_dir/" \
--include="dir/another_dir/***" \
--exclude="*/*" 1_counts/* .

因为顺序很重要,人们在一开始就制定了按扩展名排除文件的规则, 和最后排除所有规则

相关内容