Perl 检查文件大小,如果文件没有增长,则将其移动[readdir]

Perl 检查文件大小,如果文件没有增长,则将其移动[readdir],perl,Perl,我首先为Windows平台制作了脚本,它成功了。现在,我已经将脚本移动到Ubuntu,但无法使其工作 读取文件大小时有问题吗 while ( opendir my $dirh, "/share/Dropbox/test/in" ) { while ( my $file = readdir $dirh ) { # filter . & .. folders out next if ($file =~ m/^\./);

我首先为Windows平台制作了脚本,它成功了。现在,我已经将脚本移动到Ubuntu,但无法使其工作

读取文件大小时有问题吗

while ( opendir my $dirh, "/share/Dropbox/test/in" ) {

    while ( my $file = readdir $dirh ) {

        # filter . & .. folders out
        next if ($file =~ m/^\./);

        my $size1 = -s $file;
        print "$size1\n";

        sleep 2;

        my $size2 = -s $file;
        print "$size2\n";

        if ( $size1 == $size2 ) {
            move( $file, "/share/Dropbox/test/out" );
        }
    }

    sleep 1;
}
closedir DIR;
以及运行此操作时收到的警告:

在./file_ready_2.pl第20行的串联(.)或字符串中使用未初始化的值$size1

在./file_ready_2.pl第23行的串联(.)或字符串中使用未初始化的值$size2

在./file_ready_2.pl第25行的数字等式(=)中使用未初始化值$size2

在./file_ready_2.pl第25行的数字等式(=)中使用未初始化值$size1

在./file_ready_2.pl第20行的串联(.)或字符串中使用未初始化的值$size1

在./file_ready_2.pl第23行的串联(.)或字符串中使用未初始化的值$size2


readdir
返回的文件名与
opendir
目录相关。如果使用另一个目录作为当前目录执行脚本,则文件测试(例如
-s
)将不起作用(或测试错误的文件)

perldoc-f readdir

readdir DIRHANDLE
[…]如果您计划使用文件测试 “readdir”,你最好在有问题的目录前面加上前缀。 否则,因为我们没有“chdir”在那里,它会变成蜜蜂 测试错误的文件。[……]

问题就在这里 . 这对我在Linux上很有用(只需注释掉
move
行):


你好,谢谢你的评论。实际上,这个脚本在Windows平台上工作得非常好。请提供解决方案,或者指出我应该使用什么库?回复中添加了示例修复程序。通常应在目录和文件名之间放置路径分隔符
/
。无法保证目录名将以斜杠结尾,但多个连续的斜杠将折叠为一个。我建议(使用目录分隔符结尾目录名)使脚本在使用不同目录分隔符的系统之间可移植。而不是制定程序规则,您应该
使用File::Spec::Functions'catfile'
$File=catfile($dir,$File)
,这两个函数可以跨系统移植。正如我所说的,只要您使用
“$dir/$file”
,多个连续的斜杠都将折叠为一个斜杠,所有这些都可以工作。
# FIX1 Keep directory name in variable, make it end with directory separator 
my $dir = "/share/Dropbox/test/in/";
while (opendir my $dirh, $dir ) {
    ...
    # FIX2: prepend directory name (with trailing directory separator)
    #       for size tests  
    my $size1 = -s "$dir$file";
    print "$size1\n";
    sleep 2;
    my $size2 = -s "$dir$file";
    print "$size2\n";
    ....
#!/usr/bin/perl
use strict;
use warnings;

my $dirpath = shift;    # first cmdline argument

opendir my $dirh, $dirpath
  or die "Can't opendir $dirpath: $!\n";

chdir $dirpath
  or die "Can't chdir to $dirpath: $!\n";

while ( my $file = readdir $dirh ) {

    next if $file =~ m/^\./;    # skip dotfiles
    next if not -f $file;       # skip non-files

    my $size1 = -s $file;
    print "$size1\n";
    sleep 2;
    my $size2 = -s $file;
    print "$size2\n";

    if ( $size1 == $size2 ) {

        print "moving $file\n";
        #move($file,"/share/Dropbox/test/out");
    }
}