Perl Directory Finder不起作用?

时间:2013-05-09 20:22:31

标签: linux perl unix if-statement directory

我有一个脚本可以找到目录和.tar.gz文件。无论出于何种原因(这是我希望你可以帮助我的)我的

if ( -d $file )

没有回复它是一个目录!!!

我的剧本:

# specify the directory where you want to start the search
my $directory = $ARGV[0];
my $directoryCount = 0;

# Calling the Subroutine, which searches the File
readDirectory($directory);

sub readDirectory
{
    my $directory = shift;
    my $searchfile = shift;
        my @directories;
        my $tarOuput;

    # a little bit output, in which directory the script
    # is searching at the moment (the following line is not necessary)
    print "Searching in $directory\n\n";

    # Open and close the directory
    opendir(DIR, $directory) or die("ERROR: Couldn't open specified directory $!");
    my @files = readdir DIR;
    closedir DIR;

    shift(@files);
    shift(@files);

    print "------------------------------------------------------------------------    \n\n";

    foreach my $currentFile (@files)
    {
        print "Current File:", $currentFile, "\n\n";
        if ( -d $currentFile )  #THIS DOESN'T WORK?!?!?!?!?
        {
                        print "Directory: ", $currentFile, "\n\n";
                        #push (@directories, $currentFile);
                        #print "Found new directory:     $directories[$directoryCount]\n\nCurrent number = $directoryCount\n\n";
                        #$directoryCount++;
                        #print "Directories: ", @directories, "\n\n";
                        #next;
                        # The Subroutine is calling hisself with the new parameters
                        #readDirectory($currentFile); #recursive call through sub-directories
        }

        elsif ( $currentFile =~ /\.tar.gz$/i || $currentFile =~ /\.tar$/i)
        {
                        print "File: ", $currentFile, "\n\n";
                        my $tarOutput = `tar -tvzf $currentFile`;
                        print $tarOutput, "\n";
        }

        print "-----------------------------------------------------------------------    \n\n";
    }
}

如果目录永远不会打印,那么将打印$ currentFile的print语句...

输出:

Searching in /home/gackerma/Logs

------------------------------------------------------------------------

Current File:Dir1

-----------------------------------------------------------------------

Current File:file

-----------------------------------------------------------------------

Current File:configs.tar.gz

File: configs.tar.gz

tar (child): configs.tar.gz: Cannot open: No such file or directory
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now

-----------------------------------------------------------------------

Current File:adstatlog.299

-----------------------------------------------------------------------

Current File:adstatlog.tgz

-----------------------------------------------------------------------

我在同一个目录中使用超级简单的脚本做了完全相同的事情并且它可以工作......但不,不在这里。我不明白什么是错的......?

请帮忙吗?

2 个答案:

答案 0 :(得分:3)

这看起来不错。请参阅下面的diff

--- yours.pl    
+++ mine.pl 

     # Open and close the directory
     opendir(DIR, $directory) or die("ERROR: Couldn't open specified directory $!");
-    my @files = readdir DIR;
+    my @files = grep { $_ !~ /^\.{1,2}$/ } readdir DIR;
     closedir DIR;

-    shift(@files);
-    shift(@files);

     foreach my $currentFile (@files)
     {
+        my $fullPath = "$directory/$currentFile";
         print "Current File:", $currentFile, "\n\n";
-        if ( -d $currentFile )  #THIS DOESN'T WORK?!?!?!?!?
+        if ( -d $fullPath )  #THIS DOESN'T WORK?!?!?!?!?
         {
             print "Directory: ", $currentFile, "\n\n";
             #push (@directories, $currentFile);
             #print "Directories: ", @directories, "\n\n";
             #next;
             # The Subroutine is calling hisself with the new parameters
-            #readDirectory($currentFile); #recursive call through sub-directories
+            readDirectory($fullPath); #recursive call through sub-directories
         }

我猜测双shift意味着要转移“。”和“..”,这是不正确的。如果你做sort @files,这可能会有效,但仍然是一个糟糕的方法。请参阅grep

下一个问题是$currentFile需要成为完整路径。否则它在当前工作目录中寻找$currentFile

答案 1 :(得分:0)

尝试:

if ( -d $directory.'/'.$currentFile )