java8 - 使用ChannelSftp模式匹配选择上次修改的文件

问题描述 投票:-1回答:1

我知道ChannelSftp.ls作为Directory的参数,它列出了向量列表,我们的项目要求是从匹配的glob模式中找出最后修改的文件并将其移动到另一个目录,我们可以实现它string.contains()的方法也是,什么是在Java-8JSCH 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
    }
}
java regex collections java-8 jsch
1个回答
1
投票

这里Java-8对你没有多大帮助。使用Regex可以轻松识别日期编号:

\w+_\w+_(\d+)\.\w{2,4}

只是我想在xxxxlastbird上的一个注释总是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);    
© www.soinside.com 2019 - 2024. All rights reserved.