我想 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/ .