【问题标题】:perl regex matching challenge finding size of folder and sub-folders on Windowsperl 正则表达式匹配挑战在 Windows 上查找文件夹和子文件夹的大小
【发布时间】:2020-03-20 21:34:10
【问题描述】:

我对编程很陌生,但我编写了一个脚本,使用 File::Find 来计算文件夹和子文件夹的大小,使用示例中的以下行:

find(sub { $total += -s if -f }, "$scanlocation.vir");

这在大多数情况下都有效,但是,有一个文件夹非常深,它显示错误:Can't cd to ../../../../../../.. 并停止。

我尝试通过本地驱动器号、来自另一台计算机的网络分配号甚至 UNC \server\share 格式来引用扫描位置。参考本地盘符,显示错误,其他两种方法不出错也不计算总数。

我有一个这样结束的目录列表:

 Directory of x:\ready\14235.20013336.vir\2020-01-13\HP27680588713\PUBLIC\archive\Rasphone

    03/07/2020  05:24 PM    <DIR>          .
    03/07/2020  05:24 PM    <DIR>          ..
    06/24/2013  05:22 PM                 2 rasphone.pbk
                   1 File(s)              2 bytes

     Directory of x:\ready\14235.20013336.vir\2020-01-13\HP27680588713\PUBLIC\archive\WirelessKeyView

    03/07/2020  05:24 PM    <DIR>          .
    03/07/2020  05:24 PM    <DIR>          ..
    01/13/2020  06:39 PM                 0 WirelessKeyView.txt
    01/13/2020  06:39 PM                 0 WirelessKeyViewExport.txt
                   2 File(s)              0 bytes

         Total Files **Listed:
                8693 File(s)  8,711,887,757 bytes**
                5852 Dir(s)  98,156,724,404,224 bytes free

并认为正则表达式可以提取值。我已经接近/Listed:.*File\(s\).*?bytes/gs,但我只能匹配上面的粗体部分。

我的最终目标是获取指定文件夹的磁盘大小,包括以字节为单位的子文件夹。我已经用直接输出创建了 txt 文件。

因此,我们将不胜感激任何建议或指出我正确的方向。

谢谢。

【问题讨论】:

  • 使用findno_chdir选项有帮助吗?
  • 在路径前加上//?/x:/ready/...而不是x:/ready/...会有帮助吗

标签: regex perl directory size


【解决方案1】:
my $data = do { local $/; <DATA> };

my ($total) = $data =~ /Total[ ]Files[ ]Listed: \s+ \d+ \s+ File\(s\) \s+ ([\d,]+) \s+ bytes/x
   or die("No match");

print("Total: $total\n");

__DATA__
03/07/2020  05:24 PM    <DIR>          .
03/07/2020  05:24 PM    <DIR>          ..
06/24/2013  05:22 PM                 2 rasphone.pbk
               1 File(s)              2 bytes

 Directory of x:\ready\14235.20013336.vir\2020-01-13\HP27680588713\PUBLIC\archive\WirelessKeyView

03/07/2020  05:24 PM    <DIR>          .
03/07/2020  05:24 PM    <DIR>          ..
01/13/2020  06:39 PM                 0 WirelessKeyView.txt
01/13/2020  06:39 PM                 0 WirelessKeyViewExport.txt
               2 File(s)              0 bytes

     Total Files Listed:
            8693 File(s)  8,711,887,757 bytes
            5852 Dir(s)  98,156,724,404,224 bytes free

【讨论】:

  • 我在一个在线正则表达式生成器中使用了这个正则表达式,将它与文件匹配,我认为这正是我所需要的。但是当我将它放入代码并打开文件时,$total 没有分配任何东西。
  • 打开 FOO,"X:\\ready\\14235.20013336.virddd\\14235.20013336.dir"; $data = join('',);关闭 FOO; # 打印 "DATA $data\n";我的 ($total) = $data =~ "/Total[ ]Files[ ]Listed: \s+ \d+ \s+ File(s) \s+ ([\d,]+)/x";打印 "\nTOTAL $total\n";
  • 提示:不要使用全局变量!使用 3-arg open,并检查 open 是否成功。使用open(my $foo, "&lt;", $qfn) or die("Can't open \"$qfn\": $!\n");
  • 最后一个可能是相关的。如果open 失败,那么$data 将是一个空字符串。
  • bytes 之前缺少一个 \s+。固定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-26
  • 1970-01-01
  • 1970-01-01
  • 2012-11-03
  • 1970-01-01
  • 2017-06-12
相关资源
最近更新 更多