2011-03-04 74 views

回答

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

为什么运行,而不是'unlink'内置另一个shell(系统)? – bvr 2011-03-04 12:10:49

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(); 
4
chdir $dir or die $!; 
unlink grep { $_ ne 'tmp.txt' } <*.txt>; 
+0

非常漂亮和优雅,但我需要正则表达式,因为我有上面的例子比其他用途。我必须说,当你掌握它时,Perl看起来很酷;) – watbywbarif 2011-03-07 14:51:33

+0

有人可以解释'<*.txt>'吗?我不明白什么命令获得目录列表。 Perl newb。 – watbywbarif 2011-03-07 15:08:47

+0

http://www.stat.berkeley.edu/~spector/extension/perl/notes/node50.html – watbywbarif 2011-03-08 07:20:59

0

有一个perl程序:prenamerename在大多数Linux版本),只需使用与RM组合:

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

键入答案后,我看到了你要求为Windows解。我认为你最好的选择是下载(Perl源代码)预编名称,并编辑一下,以便它可以与Windows一起工作。

1

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

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

+0

我的目录从来没有超过300个文件,所以我会用这个简单的解决方案。但thx的额外信息! – watbywbarif 2011-03-07 14:55:40