【问题标题】:Perl Directory Finder doesn't work?Perl 目录查找器不起作用?
【发布时间】:2013-05-04 10:33:51
【问题描述】:

我有一个脚本来查找目录和 .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 是目录,打印语句将永远不会打印...

输出:

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

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

我在同一个目录中用一个超级简单的脚本做了同样的事情,它可以工作......但是不,不是在这里。我不明白怎么了...?

请帮忙?

【问题讨论】:

    标签: linux perl unix if-statement directory


    【解决方案1】:

    这看起来是错误的。请参阅下面的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

    【讨论】:

    • 是的,这就是 Shifts 的用途。谢谢你!
    • @user2340116 现在清楚了吗?或者您在阅读此 diff 输出时遇到问题?
    • @user2340116 NP,还要注意shifting 部分。这很可能是删除了您不打算丢失的两个文件。
    • 实际上它正在删除“。”和“..”就像你说的。但是,是的,我知道这不是这样做的方法,因为我确信会出现一些情况,即它们不是第一个 2 被放入他的数组。你的 grep 行删除了这些,对吧?
    • @user2340116 是的,grep 是这样做的方法
    【解决方案2】:

    尝试:

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

    【讨论】:

      猜你喜欢
      • 2011-06-15
      • 2017-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-22
      • 1970-01-01
      • 2014-10-01
      • 2014-09-27
      相关资源
      最近更新 更多