Perl tar error

Hi - right now i know to use the below modules
use Archive::Zip;
use Archive::Zip qw( :ERROR_CODES :CONSTANTS);

to zip the file, but this requires installing this module in the server (cpan Archive::Zip) and which is not allowed in the server as of now.
So I want to use tar cvzf in my perl script and I tried the below code and got an error

use 5.010;
use strict;
use warnings;
my $compareDirectory="/TestData/FolderB";
my $ZipLocation="/TestData/FolderC/";
sub getCurrentDateTime(){
  my @locTime = localtime();
  my $currentDateTime = sprintf("%4d%02d%02d%02d%02d%02d",
      1900 + $locTime[5], $locTime[4] + 1, $locTime[3],
      $locTime[2], $locTime[1], $locTime[0]);
  return $currentDateTime;
}
my $currentDateTime = getCurrentDateTime(); 
my $name = "testfile1.txt";
my $zipName = $name."_".$currentDateTime.".tar.gz";
print "zipName: $zipName \n";
tar cvzf $ZipLocation/$zipName $compareDirectory/$name;

Open in new window


Error:
Scalar found where operator expected at timetesting.pl line 22, near "$zipName $
compareDirectory"
        (Missing operator before $compareDirectory?)
syntax error at timetesting.pl line 22, near "$zipName $compareDirectory"
Execution of timetesting.pl aborted due to compilation errors.
Press any key to continue . . .
shragiAsked:
Who is Participating?
 
FishMongerCommented:
Here's a cleaned up version of your script.
#!/usr/bin/perl

use 5.010;
use strict;
use warnings;
use POSIX qw(strftime);

my $compare_directory = "/TestData/FolderB";
my $zip_location      = "/TestData/FolderC/";
my $name              = "testfile1.txt";
my $current_date_time = strftime("%Y%m%d%H%M%S", localtime);
my $zip_name          = "${name}_$current_date_time.tar.gz";

say $zip_name;

system("tar -cvzf $zip_location/$zip_name $compare_directory/$name");

Open in new window

0
 
FishMongerCommented:
The problem is this line:
tar cvzf $ZipLocation/$zipName $compareDirectory/$name;

Open in new window

If you intended to execute that command, you need to wrap it in ` ` backticks, or the qx() operator, or the system() function.

my $cmd_putput = `tar cvzf $ZipLocation/$zipName $compareDirectory/$name`;

Open in new window

my $cmd_putput = qx("tar cvzf $ZipLocation/$zipName $compareDirectory/$name");

Open in new window

system("tar cvzf $ZipLocation/$zipName $compareDirectory/$name");

Open in new window

0
 
FishMongerCommented:
Also, get rid of that getCurrentDateTime() sub and instead use the strftime function from the POSIX (core) module.
use POSIX qw(strftime);
my $current_date_time = strftime("%Y%m%d%H%M%S", localtime);

Open in new window

0
Cloud Class® Course: MCSA MCSE Windows Server 2012

This course teaches how to install and configure Windows Server 2012 R2.  It is the first step on your path to becoming a Microsoft Certified Solutions Expert (MCSE).

 
FishMongerCommented:
BTW, I forgot to mention that you could use Archive::Tar, which is a core module, instead of shelling out to the system.
0
 
shragiAuthor Commented:
Hi FishMonger - The code did not work and did not create tar file and I got an error saying
Error:
tar: Removing leading '/' from member names

Open in new window


#!/usr/bin/perl

use 5.010;
use strict;
use warnings;
use POSIX qw(strftime);

my $compare_directory = "/home/user1/TestData/FolderB";
my $zip_location      = "/home/user1/TestData/FolderC";
my $fname              = "testfile1.txt";
my $name              = "testfile1";
my $current_date_time = strftime("%Y%m%d%H%M%S", localtime);
my $zip_name          = "${name}_$current_date_time.tar.gz";

print $zip_name;

system("tar -cvzf $zip_location/$zip_name $compare_directory/$fname");

Open in new window

0
 
tel2Commented:
> "...The code did not work and did not create tar file and I got an error saying
Error:"


Did it actually say "Error"?  That should be a warning, and is just telling you that it's making the paths relative so you can restore it to anywhere, not just to the original root position, which is good news.

Are you sure it didn't work?
What files do you see in /home/user1/TestData/FolderC ?
0
 
shragiAuthor Commented:
that's true its not an error and it worked, sorry i gave the wrong path.
Is there a way to avoid that warning.

Thanks,
0
 
tel2Commented:
Yes.
One way is to remove the leading '/' from this:
    my $compare_directory = "/home/user1/TestData/FolderB";
so it's a relative path, like this:
    my $compare_directory = "home/user1/TestData/FolderB";

And then change this:
    system("tar -cvzf $zip_location/$zip_name $compare_directory/$fname");
so it automatically changes directory to '/' before creating the archive, like this:
    system("tar -C / -cvzf $zip_location/$zip_name $compare_directory/$fname");

See: man tar:
       -C, --directory=DIR
              change to directory DIR

Another way is to prevent tar from stripping the leading '/'.
Again, see: man tar:
       -P, --absolute-names
              don't strip leading `/'s from file names
But I wouldn't recommend this, because it could make your backups harder to restore to where you want them, if you backed them up with a leading '/' in the path.

Another way would be to redirect STDERR (warnings/errors) to somewhere else, but I wouldn't recommend that either, because then you wouldn't see any warnings/errors (e.g. disk space errors).
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.