据我所知ChannelSftp.ls
作为Directory
的参数,它列出了向量列表,我们的项目要求是从匹配的glob模式中找出最后一个修改的文件并将其移至另一个目录,我们也可以通过string.contains()
的方法来实现它,Java-8
,JSCH 0.1.51
中最简单的方法是什么。下面是我正在尝试如何修复它以使其正常工作的代码
文件目录列表如下:
xx_lastbird_20180909.txt
xABBS_xxx_firstbird_20170609.txt
xxxx_firstbird_20170609.txt
xxxxx_firstbird_20150909.txt
代码:
Vector ls = channelSftp.ls(path);
Pattern pattern = Pattern.compile("*_[lastbird,firstbird]_[0-9]{8}.txt");
for (Object entry : ls) {
ChannelSftp.LsEntry e = (ChannelSftp.LsEntry) entry;
//match regex on e.getFilename()
Matcher m = pattern.matcher(e.getFilename());
if (m.matches()) {
// last modified file object from matched file names
}
}
答案 0 :(得分:1)
Java-8不会对您有太大帮助。日期编号可以通过Regex轻松识别:
\w+_\w+_(\d+)\.\w{2,4}
我想在xxxx
和lastbird
上的注释始终是1..n个字母,用_
分隔符分隔,然后再跟一个。然后是代表日期的数字部分。最后,文件扩展名包括2-4个字母。
利用此优势获取日期(例如20170609
)。可以将它们解析为整数,并且由于这种格式可以直接进行整数比较,因此可以得到最大的数字。
Pattern pattern = Pattern.compile("\\w+_\\w+_(\\d+)\\.\\w{2,4}");
Matcher matcher;
int maxIndex = 0;
int maxDate = 0;
for (int i=0; i<ls.size(); i++) {
String filename = ((ChannelSftp.LsEntry) entry).getFilename();
matcher = pattern.matcher(filename);
if (matcher.find(1)) {
int date = Integer.parseInt(matcher.group(1));
if (date >= maxDate) {
date = maxDate;
maxIndex = i;
}
}
}
System.out.println("Last modified file is found on index: " + maxIndex);
ChannelSftp.LsEntry = (ChannelSftp.LsEntry) vector.get(maxIndex);