Невозможно получить размер файла из списка каталогов - PullRequest
0 голосов
/ 10 октября 2018

В настоящее время я пытаюсь получить размеры всех файлов в списке каталогов (игнорируя любые подкаталоги).Я использую операции opendir и readdir, и для каждого файла я вывожу имя и размер в файл.Имя файла выводится правильно, но не размер.Я пробовал это, используя оператор -s и встроенную функцию stat, но с обоими я получаю предупреждение, что значение неинициализировано.

Мой код:

   #!/usr/bin/perl

    use strict;
    use warnings;

    my $dir = $ARGV[0];

    opendir(DIR, $dir) or die "Could not open directory '$dir' $!";

    my $filename = 'FileSize.txt';
    open(my $fh, '>', $filename) or die "Could not open file '$filename' $!";

    while (my $file = readdir(DIR)) {

        # Ignore Sub-Directories
        next unless (-f "$dir/$file");
        my $size = -s $file;
        print $fh "$file"," ","$size\n";

    }

    closedir(DIR);
    exit 0;

Iвыполните команду из самого каталога верхнего уровня, включая имя проверяемого подкаталога, и получите следующую ошибку, по одному на каждый файл в подкаталоге, который обрабатывается

C:\Users\lafarnum\Documents>perl FileComp.pl DiskImage
Use of uninitialized value $size in concatenation (.) or string at 
FileComp.pl line 18.

Следовательно, имена файлов правильно выводятся в выходной файл, но не размеры файлов.Выходной файл выглядит следующим образом

BuildState.txt
data1.cab 
data1.hdr 
data2.cab 
ISSetup.dll 
layout.bin 
README.doc 
setup.bmp
setup.exe 
setup.ini 
setup.inx 
setup.iss 
vcredist_x86.exe 
_Setup.dll 

Я думаю, это как-то связано с тем, как я получаю переменную файла из readdir.Все примеры использования оператора -s и встроенной функции stat были, когда пользователи жестко закодировали имена файлов, а не извлекли их, используя readdir.Я новичок в использовании Perl, поэтому прошу прощения, если я делаю основную ошибку.

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

(как указано @tinita) Операторы тестирования файла требуют относительного или абсолютного пути к файлу, в то время как readdir будет возвращать только базовое имя файла, поэтому вам нужно объединить каталог, который вы перебираете, с базовым именемчтобы получить путь к файлу.

my $size = -s "$dir/$file";

Для забавы, вот как этот скрипт может выглядеть, используя Path :: Tiny :

use strict;
use warnings;
use Path::Tiny;

my $dir = $ARGV[0];

my $fh = path('FileSize.txt')->openw;

foreach my $file (grep { -f } path($dir)->children) {
    my $basename = $file->basename;
    my $size = -s $file;
    print $fh "$basename $size\n";
}
0 голосов
/ 10 октября 2018

Будет работать что-то вроде нижнего вкладыша.

/usr/libexec> \ls -1 | perl -ne '  while (<>) {chop($_); $size= -s "$_"; print "$size, $_\n" if not -d $_ } '
96168, gam_server
18808, gnupg-pcsc-wrapper
52232, gpg2keys_curl
61120, gpg2keys_finger
60888, gpg2keys_hkp
66432, gpg2keys_ldap
100344, gpg-check-pattern
85616, gpg-preset-passphrase
210416, gpg-protect-tool
21096, hald-addon-acpi
22352, hald-addon-generic-backlight
24136, hald-addon-hid-ups
17328, hald-addon-imac-backlight
31448, hald-addon-input
22776, hald-addon-ipw-killswitch
26224, hald-addon-leds
22384, hald-addon-macbook-backlight
22672, hald-addon-macbookpro-backlight
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...