4

I have multiple files at an sftp location like

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

through my java program i want to get list of files only in format xyz_YYYYMMDD.csv.gz , what should be my match pattern to pass in ChannelSftp.ls command .

I am passing

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

ChannelSftp.ls(pattern);

What should be my pattern to pass in ls command ?

Adon Smith
  • 1,849
  • 7
  • 19
  • 19

2 Answers2

6

ChannelSftp.ls takes as argument a path: http://epaul.github.io/jsch-documentation/javadoc/com/jcraft/jsch/ChannelSftp.html#ls(java.lang.String)

the path can contain glob pattern wildcards (* or ?) but with this you are not able to check that date has digits in it.

so just list the path and apply regex after

        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
            }

        }

in case you don't need to check that date is formatted from digits you can just use following pattern and ChannelSftp.ls

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

but this will also match something like: xyz_2014_aaa.csv.gz

Liviu Stirb
  • 5,876
  • 3
  • 35
  • 40
  • Can't i pass the regular expression in any way in ls command itself – Adon Smith Jan 19 '15 at 08:15
  • i can't find any method in the api that takes a regex; but i don't see any inconvenient since you are not downloading the files just take the names – Liviu Stirb Jan 19 '15 at 08:16
  • Thanks you have answered my problem, i was thinking in the same way , but just tell me how can i create a regular expression for the files. – Adon Smith Jan 19 '15 at 10:22
  • @AdonSmith edited; basically you will allow digits from 0-9 8 times – Liviu Stirb Jan 19 '15 at 11:01
  • also good for files starting prinklr_ and 8 digits; different ways to write a digit; use any you like; please accept if it answered your problem – Liviu Stirb Jan 19 '15 at 11:22
  • While your code works, it's not true that you cannot pass a pattern to the `path` argument of `channelSftp.ls`. It's documented on the very doc page you link to. – Martin Prikryl Jan 20 '15 at 07:52
  • @MartinPrikryl the only thing that make me use this was that I expect to check that date has digits in it. – Liviu Stirb Jan 20 '15 at 12:51
  • OK, if you make it clear in your answer why you used your own implementation instead of doing this one-line using Jsch built-in functionality, I'll happily upvote your answer. – Martin Prikryl Jan 20 '15 at 14:21
  • @MartinPrikryl done; and it makes sense maybe my assumption was wrong – Liviu Stirb Jan 20 '15 at 14:45
0

The ChannelSftp.ls accepts path AND pattern in its path argument:

Parameters:

path - a pattern relative to the current remote directory. The pattern can contain glob pattern wildcards (* or ?) in the last component (i.e. after the last /).

You should include a path to the directory to the argument; and modify the pattern to match only the files you need. The pattern you are using indeed matches any file on your list, not only the files you want.

You can use xyz_????????.csv.gz to explicitly require the variable part to have 8 characters.

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

files = channel.ls(path_and_pattern);
Martin Prikryl
  • 188,800
  • 56
  • 490
  • 992