我对此进行了彻底的研究。一切应该"工作"对我来说没有,所以我想我会在这里问。
我有一个看起来像的目录树:
root/ CK1E/ 3DConformers/ OtherStuff/ PDE4B/ 3DConformers/ OtherStuff/ ...
我正在尝试使用rsync命令来检索" 3DConformers"每个项目的子目录。
我正在发出以下形式的命令:
rsync -avz user@host:/path/to/root/ . --exclude "*" --include-from rules -v -v
我无法获得一般规则,所以我决定使用特定的规则,专注于" CK1E"子目录。我阅读了关于rsync是否需要/需要前导或尾随斜杠的相互矛盾的报告,所以我采用了霰弹枪的方法。我当前的规则文件如下所示:
/CK1E /CK1E/ /CK1E/3DConformers /CK1E/3DConformers/ /CK1E/3DConformers/* CK1E CK1E/ CK1E/3DConformers CK1E/3DConformers/ CK1E/3DConformers/*
我从rsync获得以下输出。注意" CK1E"目录仍然被忽略!
receiving incremental file list [sender] add_rule(- *) [sender] add_rule(+ /CK1E) [sender] add_rule(+ /CK1E/) [sender] add_rule(+ /CK1E/3DConformers) [sender] add_rule(+ /CK1E/3DConformers/) [sender] add_rule(+ /CK1E/3DConformers/*) [sender] add_rule(+ CK1E) [sender] add_rule(+ CK1E/) [sender] add_rule(+ CK1E/3DConformers) [sender] add_rule(+ CK1E/3DConformers/) [sender] add_rule(+ CK1E/3DConformers/*) server_sender starting pid=2451269 [sender] make_file(.,*,0) recv_file_name(.) ... [sender] hiding directory CK1E because of pattern * ... received 1 names recv_file_list done send_file_list done get_local_name count=1 . generator starting pid=27883 delta-transmission enabled recv_generator(.,0) recv_generator(.,1) generate_files phase=1 recv_files(1) starting send_files starting send_files(0, /path/to/root/.) recv_files(.) send_files phase=1 recv_files phase=1 generate_files phase=2 send_files phase=2 recv_files phase=2 send files finished total: matches=0 hash_hits=0 false_alarms=0 data=0 recv_files finished generate_files phase=3 generate_files finished sent 212 bytes received 1578 bytes 275.38 bytes/sec total size is 0 speedup is 0.00 _exit_cleanup(code=0, file=main.c, line=1505): about to call exit(0)
帮助?!
答案 0 :(得分:0)
包含/排除规则的排序很重要:匹配文件的第一个包含/排除规则是重要的。
您的第一条规则是--exclude="*"
,因此您排除所有内容。您需要重新排序规则,以便在全部排除规则之前,您的包含规则与匹配。
此命令应该有效:
rsync -avz user@host:/path/to/root/ . \
--include "/CK1E/" \
--include "/CK1E/3DConformers/" \
--include "/CK1E/3DConformers/*" \
--exclude "*"
您需要添加中间目录以及文件,因为如果您没有明确提及它们,则catch-all排除规则将匹配它们,如果直接排除,那么内容。
(\
不是命令的一部分;它们只是表示行继续;当你剪切和粘贴时,你的shell会做正确的事。)