【问题标题】:Delete files that match regex删除文件正则表达式匹配
【发布时间】:2011-07-08 18:35:46
【问题描述】:

在 Windows 上从与 Perl 中的某些正则表达式匹配的目录中删除所有文件的最短和最好的方法。

我的例子:从目录中删除所有*.txt文件,但留下tmp.txt?窗户。

【问题讨论】:

    标签: windows regex perl delete-file


    【解决方案1】:
    chdir $dir or die $!;
    unlink grep { $_ ne 'tmp.txt' } <*.txt>;
    

    【讨论】:

    • 非常漂亮和优雅,但我需要正则表达式,因为除了上面的示例之外,我还有其他用途。我必须说,当你掌握 Perl 时,它看起来很酷;)
    • 有人能解释一下''吗?我不明白什么命令获取目录列表。 Perl 新手。
    【解决方案2】:
    # glob gets the names of all .txt files
    # we apply grep to remove tmp.txt from the list
    @files = grep (!/^tmp\.txt$/,glob('*.txt'));
    
    # delete the files
    unlink @files;
    

    【讨论】:

    • 为什么要运行另一个shell(系统)而不是unlink内置?
    【解决方案3】:

    虽然不完美,但也许有些冗长的东西会有所帮助。

    use strict;
    use warnings;
    
    my $dir = "/tmp";
    my $posreg = '.*\.txt$';
    my $nexreg = '^tmp\.txt$';
    
    opendir(my DH, $dir) || die($!);
    {
        for my $file (grep { /$posreg/i
                        && ! /$negreg/i
                        && -f "$dir/$_" } readdir($DH))         
        {
            unlink($file) || die($!);
        }
    }
    closedir();
    

    【讨论】:

      【解决方案4】:

      如果目录中有很多文件(10,000 或更多),上述所有解决方案都可能存在问题,因为它们都一次读取整个文件列表。安全的做法是遍历目录,而不是一次全部读取。 “readdir”可以只返回标量上下文中的下一个条目。我建议使用一次遍历目录一个条目的 while 循环更新@hpvac 的答案。

      (如果你确定永远不会有大量文件,上面的解决方案是可行的。)

      【讨论】:

      • 我的目录从来没有超过 300 个文件,所以我将使用这个简单的解决方案。但是谢谢您提供更多信息!
      【解决方案5】:

      有一个 perl 实用程序:prename(大多数 linux 上为rename),只需将其与 rm 结合使用即可:

      prename `s/(?!tmp.txt)\.txt$/DELETE_THIS_$&` 
      rm DELETE_THIS_*
      

      输入答案后,我看到您要求提供 Windows 解决方案。我认为您最好的选择是下载(Perl 源代码)作为前缀名,并对其进行一些编辑,使其适用于 Windows。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多