2016-06-22 66 views
1

阅读过滤规则手册页,看着这里后:Using Rsync filter to include/exclude filesRsync的过滤器在Python循环

我不明白,为什么下面的代码无法正常工作。

import subprocess, os 
from ftplib import FTP 

ftp_site = 'ftp.ncbi.nlm.nih.gov' 
ftp = FTP(ftp_site) 
ftp.login() 
ftp.cwd('genomes/genbank/bacteria') 
dirs = ftp.nlst() 

for organism in dirs: 
    latest = os.path.join(organism, "latest_assembly_versions") 
    for path in ftp.nlst(latest): 
     accession = path.split("/")[-1] 
     fasta = accession+"_genomic.fna.gz" 
     subprocess.call(['rsync', 
         '--recursive', 
         '--copy-links', 
         #'--dry-run', 
         '-vv', 
         '-f=+ '+accession+'/*', 
         '-f=+ '+fasta, 
         '-f=- *', 
         'ftp.ncbi.nlm.nih.gov::genomes/genbank/bacteria/'+latest, 
         '--log-file=scratch/test_dir/log.txt', 
         'scratch/' + organism]) 

我也试过'--exclude=*[^'+fasta+']'尽量排除不中latest/*匹配fasta代替-f=- *

对于每个目录path文件,我想这完全匹配fasta文件。目录latest/path中始终只有一个文件fasta

编辑:我与的rsync版本3.1.0测试这一点,并已经看到了不兼容问题与早期版本。

这里是工作的代码,你应该能够将其粘贴到Python解释器得到的结果中的链接“试运行”,这将不会下载任何东西到你的机器:http://pastebin.com/0reVKMCgftp.ncbi.nlm.nih.gov::genomes/genbank/bacteria/'+latest下得到的一切,这不是我想要的。如果我运行该脚本与'-f=- *'取消注释,它没有得到任何东西,这似乎违背这里Using Rsync filter to include/exclude files

+0

你确定你可以通过FTP使用'rsync'吗?:http://serverfault.com/questions/24622/how-to-use-rsync-over -ftp –

+0

是的,我确定。我有一个类似的脚本工作得很漂亮,直到我意识到我得到的一些文件(根据我的过滤器)是我不想要的文件。 – truthling

+0

嗯,你可以发布工作片段,以便我们可以得到一个示例输出,然后进一步阐明你想要过滤的内容? –

回答

0

答案这包含我需要解决我的问题的信息的rsync手册页的一部分:

请注意,当使用--recursive(-r)选项(由-a暗示)时,每个 路径的每个子组件都会从上到下访问,因此包含/排除模式会递归应用于每个子组件 - nent的全名(例如包括“/ foo/bar/baz”,排除子组件“/ foo”和“/ foo/bar”不得为 )。当rsync发现 文件发送时,排除模式实际上使目录遍历阶段短路。如果某个模式排除了特定的父目录,则它可能会导致更深入的包含,因为rsync并未通过层次结构的排除部分下降。这是 使用尾随'*'规则时尤为重要。举例来说,这是不行的:

+ /一些/路径/这个文件 - 将 - 不被发现的

+ /文件中,包括

- *

由于“*”规则排除了父目录“some”,因此rsync从不会访问“some”或“some/path”目录中的任何 文件。一种解决方案是通过使用单个规则来请求包含 层级中的所有目录:“+ * /”(将其放置在“ - *”规则之前的某个位置),并且每个haps使用--prune-空dirs选项。另一种解决方案是为所有需要访问的父级代表添加特定的包含规则。举例来说,这套规则正常工作:

+ /一些/

+ /一些/路径/

+ /一些/路径/这个文件,被发现的

+ /文件还-包括

- *

帮我写了下面的代码:

def get_fastas(local_mirror="scratch/ncbi", bacteria="Escherichia_coli"): 
     ftp_site = 'ftp.ncbi.nlm.nih.gov' 
     ftp = FTP(ftp_site) 
     ftp.login() 
     ftp.cwd('genomes/genbank/bacteria') 
     rsync_log = os.path.join(local_mirror, "rsync_log.txt") 
     latest = os.path.join(bacteria, 'latest_assembly_versions') 
     for parent in ftp.nlst(latest)[0:2]: 
       accession = parent.split("/")[-1] 
       fasta = accession+"_genomic.fna.gz" 
       organism_dir = os.path.join(local_mirror, bacteria) 
       subprocess.call(['rsync', 
           '--copy-links', 
           '--recursive', 
           '--itemize-changes', 
           '--prune-empty-dirs', 
           '-f=+ '+accession, 
           '-f=+ '+fasta, 
           '--exclude=*', 
           'ftp.ncbi.nlm.nih.gov::genomes/genbank/bacteria/'+parent, 
           organism_dir]) 

原来'-f=+ '+accession,不尾随/后,用*工作。虽然它确实可以在只有尾部的情况下工作/没有*