删除与正则表达式匹配的文件

时间:2011-03-04 11:44:47

标签: windows regex perl delete-file

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

我的示例:从目录中删除所有*.txt个文件,但是保留tmp.txt?视窗。

5 个答案:

答案 0 :(得分:4)

chdir $dir or die $!;
unlink grep { $_ ne 'tmp.txt' } <*.txt>;

答案 1 :(得分:3)

# 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;

答案 2 :(得分:1)

虽然不完美,但也许长篇大论会有所帮助。

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();

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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

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

输入答案后,我看到你要求提供Windows解决方案。我认为你最好的选择是下载(Perl源代码)prename,然后编辑一下,以便它适用于Windows。