【问题标题】:JSch ChannelSftp.ls - pass match patterns in javaJSch ChannelSftp.ls - 在 java 中传递匹配模式
【发布时间】:2015-01-19 07:51:11
【问题描述】:

我在 sftp 位置有多个文件,例如

xyz_20140101.csv.gz
xyz_2014_01_01.csv.gz
xyz_20140202.csv.gz
xyz_2014_02_02.csv.gz

通过我的 java 程序,我只想获取格式为 xyz_YYYYMMDD.csv.gz 的文件列表,我应该在 ChannelSftp.ls 命令中传递什么匹配模式。

我路过

pattern = xyz_*csv.gz , but it gives me all the files .

ChannelSftp.ls(pattern);

我在 ls 命令中传递的模式应该是什么?

【问题讨论】:

  • 你能告诉我一个例子/示例代码吗

标签: java regex sftp jsch


【解决方案1】:

ChannelSftp.ls 将路径作为参数:http://epaul.github.io/jsch-documentation/javadoc/com/jcraft/jsch/ChannelSftp.html#ls(java.lang.String)

路径可以包含 glob 模式通配符(* 或 ?),但这样您无法检查日期是否包含数字。

所以只需列出路径并在

之后应用正则表达式
        Vector ls = channelSftp.ls(path);
        Pattern pattern = Pattern.compile("xyz_[0-9]{8}.csv.gz");
        for (Object entry : ls) {
            ChannelSftp.LsEntry e = (ChannelSftp.LsEntry) entry;
            //match regex on e.getFilename()
            Matcher m = pattern.matcher(e.getFilename());
            if (m.matches()) {
                //TODO you code
            }

        }

如果您不需要检查日期是否由数字格式化,您可以使用以下模式和 ChannelSftp.ls

pattern =  xyz_????????.csv.gz

但这也将匹配如下内容:xyz_2014_aaa.csv.gz

【讨论】:

  • 我不能在 ls 命令本身中以任何方式传递正则表达式
  • 我在 api 中找不到任何采用正则表达式的方法;但我没有看到任何不便,因为您不下载文件只是取名字
  • 谢谢你回答了我的问题,我也是这么想的,但请告诉我如何为文件创建正则表达式。
  • @AdonSmith 已编辑;基本上你会允许 0-9 的数字 8 次
  • 也适用于以 prinklr_ 和 8 位开头的文件;写数字的不同方法;使用任何你喜欢的;如果它回答了您的问题,请接受
【解决方案2】:

ChannelSftp.ls 在其 path 参数中接受路径 AND 模式:

参数:

path - 相对于当前远程目录的模式。该模式可以在最后一个组件中包含全局模式通配符(*?)(即在最后一个 / 之后)。

您应该在参数中包含目录的路径;并修改模式以仅匹配您需要的文件。您使用的模式确实匹配您列表中的任何文件,而不仅仅是您想要的文件。

您可以使用xyz_????????.csv.gz 明确要求变量部分包含8 个字符。

path_and_pattern = "/path/xyz_????????.csv.gz";

files = channel.ls(path_and_pattern);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 2012-06-28
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    相关资源
    最近更新 更多