Frostie_the_snowman
Frostie_the_snowman

Reputation: 699

Copy file from one location to another

This is just a small script I am running in a continuous loop to check a directory and move every file that is there. This code works, and I am running it in the background processes. But, for some reason, I am getting the following error:

'/home/srvc_ibdcoe_pcdev/Niall_Test/new_dir/..' and '/home/srvc_ibdcoe_pcdev/Niall_Test/perl_files/..' 
are identical (not copied) at move2.pl line 27

Why it is telling me it is identical even though the paths are different?

script below

#!/usr/bin/perl
use diagnostics;
use strict;
use warnings;

use File::Copy;

my $poll_cycle = 10;
my $dest_dir = "/home/srvc_ibdcoe_pcdev/Niall_Test/perl_files";

while (1) {
    sleep $poll_cycle;

    my $dirname = '/home/srvc_ibdcoe_pcdev/Niall_Test/new_dir';

    opendir my $dh, $dirname
        or die "Can't open directory '$dirname' for reading: $!";

    my @files = readdir $dh;
    closedir $dh;

    if ( grep( !/^[.][.]?$/, @files ) > 0 ) {
        print "Dir is not empty\n";

        foreach my $target (@files) {
            # Move file
            move("$dirname/$target", "$dest_dir/$target");

    }
}

}

Upvotes: 6

Views: 2428

Answers (1)

toolic
toolic

Reputation: 62236

You need to filter out the special .. and . entries from @files.

#!/usr/bin/perl
use diagnostics;
use strict;
use warnings;

use File::Copy;

my $poll_cycle = 10;
my $dest_dir = "/home/srvc_ibdcoe_pcdev/Niall_Test/perl_files";

while (1) {
    sleep $poll_cycle;

    my $dirname = '/home/srvc_ibdcoe_pcdev/Niall_Test/new_dir';

    opendir my $dh, $dirname
        or die "Can't open directory '$dirname' for reading: $!";

    my @files = grep !/^[.][.]?$/, readdir $dh;
    closedir $dh;

    if (@files) {
        print "Dir is not empty\n";

        foreach my $target (@files) {
            # Move file
            move("$dirname/$target", "$dest_dir/$target");

    }
}

}

The message you see is correct. Both paths resolve to the same directory because of the ..; both resolve to /home/srvc_ibdcoe_pcdev/Niall_Test

.. refers to the directory's parent directory.

Upvotes: 9

Related Questions