PSFTP 如何使用 RegExp 从 Dir 命令获取文件名

Posted

技术标签:

【中文标题】PSFTP 如何使用 RegExp 从 Dir 命令获取文件名【英文标题】:PSFTP How to get file name from Dir command using RegExp 【发布时间】:2017-11-26 00:23:58 【问题描述】:

我正在尝试使用正则表达式来解析从 PSFTP 的dir 命令生成的日志文件。

示例目录示例 1

drwxr-xr-x 1 0        0                  0 Jun 21 13:13 .
drwxr-xr-x 1 0        0                  0 Jun 21 13:13 ..
-rw-r--r-- 1 0        0                897 Jun 20 15:02 EQA.txt
-rw-r--r-- 1 0        0                897 Jun 20 15:06 EQA1.txt
-rw-r--r-- 1 0        0                897 Jun 16 20:41 Test.txt
-rw-r--r-- 1 0        0                897 Jun 16 21:46 Test1.txt
-rw-r--r-- 1 0        0                897 Jun 21 13:13 Test4.txt
-rw-r--r-- 1 0        0                913 May 31 18:01 test.123456789.txt
psftp> bye 

示例目录示例 2

drwx------    2 MikePC-apps users        4096 Apr  5  2016 .
drwx------    4 MikePC-apps users        4096 Jan 20  2016 ..
-rw-r--r--    1 MikePC-apps users          82 Apr  5  2016 test.txt.$01
-rw-r--r--    1 MikePC-apps users          82 Aug 10  2016 test.txt.$02
-rw-r--r--    1 MikePC-apps users          82 Aug 10  2016 test.txt.asc
-rw-r--r--    1 MikePC-apps users          82 Aug 10  2016 test1.txt.$01
-rw-r--r--    1 MikePC-apps users        1927 Apr  4  2016 test.zip

所以根据我在网上找到的信息,如果文件超过 6 个月或将来,则会显示年份而不是一天中的时间。

例如 1,我使用正则表达式 :/d/d/s .*.*.* 后跟子字符串函数来检索文件名。

但我不知道如何处理第二个示例。我希望dir 命令可能有一个参数来包含时间戳,这样我就可以使用相同的正则表达式。或者也许有另一个正则表达式可以处理这两个例子。

非常感谢!

【问题讨论】:

【参考方案1】:

尝试以下:

            string[] inputs = 
                                  "drwxr-xr-x 1 0        0                  0 Jun 21 13:13 .",
                                  "ddrwxr-xr-x 1 0        0                  0 Jun 21 13:13 ..",
                                  "d-rw-r--r-- 1 0        0                897 Jun 20 15:02 EQA.txt",
                                  "d-rw-r--r-- 1 0        0                897 Jun 20 15:06 EQA1.txt",
                                  "d-rw-r--r-- 1 0        0                897 Jun 16 20:41 Test.txt",
                                  "d-rw-r--r-- 1 0        0                897 Jun 16 21:46 Test1.txt",
                                  "d-rw-r--r-- 1 0        0                897 Jun 21 13:13 Test4.txt",
                                  "d-rw-r--r-- 1 0        0                913 May 31 18:01 test.123456789.txt",
                                  "drwx------    2 MikePC-apps users        4096 Apr  5  2016 .",
                                  "drwx------    4 MikePC-apps users        4096 Jan 20  2016 ..",
                                  "-rw-r--r--    1 MikePC-apps users          82 Apr  5  2016 test.txt.$01",
                                  "-rw-r--r--    1 MikePC-apps users          82 Aug 10  2016 test.txt.$02",
                                  "-rw-r--r--    1 MikePC-apps users          82 Aug 10  2016 test.txt.asc",
                                  "-rw-r--r--    1 MikePC-apps users          82 Aug 10  2016 test1.txt.$01",
                                  "-rw-r--r--    1 MikePC-apps users        1927 Apr  4  2016 test.zip"
                              ;

            string pattern = @"^(?'attrib'[^\s]+)\s+(?'links'[^\s]+)\s+(?'owner'[^\s]+)\s+(?'group'[^\s]+)\s+(?'size'[^\s]+)\s+(?'date'.+)\s+(?'filename'[^$]+)$";

            foreach (string input in inputs)
            
                Match match = Regex.Match(input, pattern);
                Console.WriteLine("attrib : '0', links : '1', owner : '2', group : '3', size : '4', date : '5', filename : '6'",
                    match.Groups["attrib"].Value, match.Groups["links"].Value, match.Groups["owner"].Value, match.Groups["group"].Value,
                    match.Groups["size"].Value, match.Groups["date"].Value, match.Groups["filename"].Value); 
            
            Console.ReadLine();

【讨论】:

感谢您的解决方案,我将 Pattern 修改为 string pattern = @"^(?'attrib'[^\s]+)\s+(?'links'[^\s]+)\s+(?'owner'[^\s]+)\s+(?'group'[^\s]+)\s+(?'size'[^\s]+)\s+(?'date'.+)\s+(?'filename'.+)$"; 这也包含在 test1.txt.$01 作为文件名。 +1(抱歉不能投票)谢谢 $01 是文件名的一部分 我在Regexr 上测试了正则表达式([^\s]+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)\s+(.+)\s+([^$]+),由于[^] 是一个否定集,它在$ 处停止。我在模式的末尾删除了 $ 因为字符串已经被分割成句子

以上是关于PSFTP 如何使用 RegExp 从 Dir 命令获取文件名的主要内容,如果未能解决你的问题,请参考以下文章

怎么使用psftp 命令拷贝文件

使用PSFTP实现WindowsLinux之间的文件传输

PSFTP使用简单教程

PSFTP工具传输文件的命令使用方法

PSFTP工具传输文件的命令使用方法

阿里云ECS-使用putty产品psftp工具上传下载