perl删除包含指定格式文件的子目录

时间:2014-11-11 16:37:18

标签: perl

我必须在perl中执行一个程序。而且我很新。它的任务是 将有目录,里面有许多子目录将在那里。每个子目录包含更多的子目录。最后,子目录链的末尾会有文件。如果文件格式为" .TXT"我应该删除包含.TXT文件的主目录旁边的子目录。

例如raghav \ abc \ ccd \ 1.txt然后我应该删除子目录" abc"。

我的代码是

#!/usr/bin/perl
use warnings;
use strict;
use Cwd qw(abs_path);


my $path ="d:\\raghav";

search_all_folder($path);

sub search_all_folder {
    my ($folder) = @_;
    if ( -d $folder ) {
        chdir $folder;
        opendir my $dh, $folder or die "can't open the directory: $!";
        while ( defined( my $file = readdir($dh) ) ) {
            chomp $file;
            next if $file eq '.' or $file eq '..';
            search_all_folder("$folder/$file");  ## recursive call
            read_files($file) if ( -f $file );
        }
        closedir $dh or die "can't close directory: $!";
    }
}

sub read_files {
    my ($filename) = @_;

    if($filename= ~/.txt/)
    rmdir;
    }
}

1 个答案:

答案 0 :(得分:4)

永远不要实现自己的目录遍历。请改用File::Find。它更有效,更不容易破碎。

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

use File::Find;

my $search_path = "d:\\raghav";
my %text_files_found_in;

sub find_text_files {
    if (m/\.txt$/i) {
        ## you may want to transform this first, to get a higher level directory. 
        $text_files_found_in{$File::Find::dir}++;
    }
}

find( \&find_text_files, $search_path );

foreach my $dir ( keys %text_files_found_in ) {
    print "$dir contained a text file\n"; 
    ##maybe delete it, but don't until you're sure the code's working!
}

您现在已经有了一个文件列表,您可以根据这些文件找出要删除的内容然后将其删除。 rmdir虽然没有做到这一点 - 但这只适用于空目录。您可以整理文件列表(就像这样),也可以随时找出要删除的路径,并将其插入哈希。 (所以你不会得到欺骗)。

无论哪种方式 - 最好先运行查找,删除第二个,而不是尝试删除可能仍在遍历的树。

编辑:这个程序的作用:

  • 导入File :: Find模块。
  • 定义子例程find_text_files
  • 运行find(在File :: Find模块中),并告诉它在它找到的每个文件上运行find_text_files的递归遍历。
  • find_text_files在triee中的每个文件上调用($search_path下方)。当它被称为:
    • File::Find$_设置为当前文件名。我们会与m/\.txt$/进行匹配,看看它是否为文本文件。
    • File::Find还设置了另外两个变量:$File::Find::dir - 到此文件的目录路径。并$File::Find::file到完整文件路径。如果模式匹配,我们会将$File::Find::dir插入哈希text_files_found_in
  • 一旦find完成,我们就会有一个名为text_files_found_in的哈希,它包含找到文本文件的所有目录的键。
  • 然后我们可以在keys %text_files_found_in上进行迭代以识别 - 并删除。*
  • 此时,您可能希望转换该列表中的每个目录,因为它将是文件的完整路径,您可能只想在更高级别删除。

*此脚本中没有删除代码 - 您必须自己对其进行排序。我没有把任何可能删除内容的东西放在互联网上,那些不完全理解它的人可能只是盲目地操作它。