perl регулярное выражение для поиска соответствия размера папок и подпапок на Windows - PullRequest
2 голосов
/ 21 марта 2020

Я очень новичок в программировании, но написал скрипт, использующий File::Find для вычисления размера папки и подпапок, используя следующую строку из примера:

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

This работает большую часть времени, однако, была одна папка, которая была очень глубокой, и она отображала ошибку: Can't cd to ../../../../../../.. и остановлена.

Я пытался ссылаться на местоположение сканирования по букве локального диска, назначенной сети букве с другого компьютера и даже в формате UN C \ 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, но могу сравниться только с жирной частью выше.

Моя конечная цель - получить размер на диске указанной папки, включая подпапки в байтах. Я уже создаю текстовый файл с прямым выводом.

Итак, любые предложения или указывать мне в правильном направлении будут оценены.

Спасибо.

1 Ответ

1 голос
/ 21 марта 2020
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
...