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

Windows 删除与正则表达式匹配的文件,windows,regex,perl,delete-file,Windows,Regex,Perl,Delete File,在Windows上,从目录中删除与Perl中的某些正则表达式匹配的所有文件的最短、最好的方法 我的示例:从目录中删除所有*.txt文件,但保留tmp.txt?Windows。虽然不是十全十美,但也许一些冗长的东西会有所帮助 # glob gets the names of all .txt files # we apply grep to remove tmp.txt from the list @files = grep (!/^tmp\.txt$/,glob('*.txt')); # de

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


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

虽然不是十全十美,但也许一些冗长的东西会有所帮助

# 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;
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();
chdir$dir或die$!;
取消链接grep{$\ne'tmp.txt'};

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

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

键入答案后,我看到您要求Windows解决方案。我认为最好的办法是下载prename的(Perl源代码),并对其进行一点编辑,使其能够与Windows一起工作。

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


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

为什么要运行另一个shell(系统)而不是
取消链接
内置的?非常好和优雅,但我需要正则表达式,因为除了上面的示例,我还有其他用途。我必须说,当您掌握Perl时,它看起来很酷;)有人能解释一下吗?我不明白什么命令得到目录列表。My dir从来没有超过300个文件,所以我将使用这个简单的解决方案。但附加信息的thx!
prename `s/(?!tmp.txt)\.txt$/DELETE_THIS_$&` 
rm DELETE_THIS_*