根据日期内的最高字母表进行 Rsync 文件

根据日期内的最高字母表进行 Rsync 文件

我想 rsync 一个包含以下格式文件的文件夹

fixed string<yyyy-mm-dd><version letter>.xml

版本字母为 a、b、c……我只想要每个日期的最新版本的文件。因此,如果某个日期有三个文件,我只想要以“c”结尾的文件。

文件相当大,而且数量很多,所以我需要避免同步旧版本。

我的起始位置是这样的...

rsync -az --progress --exclude '.svn' --exclude 'tmp/' --relative site.com::folder/*.* .

热烈欢迎任何指导。

答案1

首先,你可以使用以下命令获取文件列表

rsync 'site.com::folder/*.*'

然后(我假设文件名称中没有空格,如果有的话请进行调整)您可以使用以下命令仅提取文件名:

rsync 'site.com::folder/*.*' | perl -pe's/^.* //;'

但如果你这样做了,你不妨同时提取日期/版本字母:

rsync 'site.com::folder/*.*' | perl -ne'
  /^.* (.*)(\d\d\d\d-\d\d-\d\d)(.)?\.xml/;
  $fixed = $1;
  $out{$2} = $3;
  END { foreach (sort keys %out) { print "$fixed$_$out{$_}.xml\n"; } }'

这将为您提供具有最新扩展名的所有文件的列表(假设 rsync 按升序返回文件;如果不是,您可以先对其输出进行排序,然后将其输入到该简短脚本中)。然后您可以使用 rsync 的--files-from参数让它仅下载这些文件。

答案2

显然,我所追求的有点超出了 rsync 本身的功能。因此,我使用它来获取文件列表,然后通过 R 对其进行处理以创建我想要的文件列表,然后使用 rsync 下载这些文件。

获取原始文件列表

rsync --list-only remoteSite.com::folder/subFolder/*.xml > filelist.txt

选择我想要的(使用 R)

  fileList <- read_delim("filelist.txt" ,delim = " ", 
                         col_names = c("permission", "size", "date", "time", "filename")) %>%
    select(-permission) %>%
        mutate(speechdate = substr(filename,8,17),
           version = substr(filename, 18,18)) %>%
    group_by(speechdate) %>%
    arrange(desc(version)) %>%
    # Just get the highest version for each date
    filter(row_number()==1) %>%
    ungroup() %>%
    summarise(filename) %>%
    select(filename) %>%
    arrange(filename)

write.table(fileList, "latestFilesForDownload.txt", 
            sep="", row.names = FALSE, col.names = FALSE, quote = FALSE)

下载所需文件

rsync -az --files-from=latestFilesForDownload.txt remoteSite.com::folder/subFolder/ .

相关内容