回答
# 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 or die $!;
unlink grep { $_ ne 'tmp.txt' } <*.txt>;
非常漂亮和优雅,但我需要正则表达式,因为我有上面的例子比其他用途。我必须说,当你掌握它时,Perl看起来很酷;) – watbywbarif 2011-03-07 14:51:33
有人可以解释'<*.txt>'吗?我不明白什么命令获得目录列表。 Perl newb。 – watbywbarif 2011-03-07 15:08:47
http://www.stat.berkeley.edu/~spector/extension/perl/notes/node50.html – watbywbarif 2011-03-08 07:20:59
有一个perl程序:prename
(rename
在大多数Linux版本),只需使用与RM组合:
prename `s/(?!tmp.txt)\.txt$/DELETE_THIS_$&`
rm DELETE_THIS_*
键入答案后,我看到了你要求为Windows解。我认为你最好的选择是下载(Perl源代码)预编名称,并编辑一下,以便它可以与Windows一起工作。
如果目录中存在大量文件(10,000或更多),上述所有解决方案都可能会出现问题,因为它们都一次读取整个文件列表。安全的做法是遍历目录,而不是一次读完所有内容。 “readdir”只能返回标量上下文中的下一个条目。我建议用一个while循环来更新@ hpvac的答案,该循环一次通过一个目录。
(如果你一定永远不会有文件数量庞大,解决方案以上是可行的。)
我的目录从来没有超过300个文件,所以我会用这个简单的解决方案。但thx的额外信息! – watbywbarif 2011-03-07 14:55:40
- 1. 删除其他正则表达式匹配的正则表达式匹配
- 2. 删除正则表达式匹配
- 3. 删除文件的正则表达式匹配部分
- 4. 删除(取消链接)匹配正则表达式的文件
- 5. 正则表达式匹配的文件
- 6. Unix - 删除与正则表达式匹配的部分
- 7. 正则表达式的表达 - 删除匹配多个选项
- 8. Mysql的正则表达式:匹配与正则表达式
- 9. Python文件正则表达式匹配
- 10. Ruby正则表达式与正则表达式匹配
- 11. 匹配列表与正则表达式
- 12. 正则表达式:匹配除
- 13. Python - 正则表达式 - 匹配除
- 14. 正则表达式来排除匹配
- 15. 正则表达式:排除匹配
- 16. 正则表达式匹配除字符
- 17. 正则表达式匹配除了
- 18. 正则表达式匹配但排除
- 19. Linux正则表达式 - 删除文件
- 20. 正则表达式匹配
- 21. 正则表达式匹配
- 22. 正则表达式匹配
- 23. 正则表达式匹配
- 24. 正则表达式匹配
- 25. 匹配正则表达式{
- 26. 正则表达式匹配%
- 27. 正则表达式匹配“|”
- 28. 正则表达式匹配
- 29. 正则表达式 - 匹配
- 30. 正则表达式匹配
为什么运行,而不是'unlink'内置另一个shell(系统)? – bvr 2011-03-04 12:10:49