我知道有十亿个这样的问题。但我确信我已经尝试了其中的很多方法,但我无法完成这项工作,所以请不要只是将其标记为重复
我有一个文件系统看起来像
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/* .
因为顺序很重要,人们在一开始就制定了按扩展名排除文件的规则, 和最后排除所有规则。