如何在Strawberry Perl中删除没有文件扩展名的文件
问题解答:Perl删除无扩展名文件方案
现有代码的问题
- 第一份
glob写法的问题:
你使用的通配符*.*强制要求文件名包含至少1个.,无扩展名的文件(文件名不含.)完全不会被匹配,所以不会被删除。 - 第二份
readdir写法的问题:readdir返回的是仅包含文件名的相对路径,直接用-f做文件测试时,Perl会默认在脚本当前工作目录查找对应文件,如果你的$dir不是当前工作目录,-f测试会返回假,对应文件就会被next跳过。
解决方案
方案1:修改glob写法
如果需要删除目标目录下所有普通文件(含带/不带扩展名),直接把通配符改为*即可:
unlink glob "$dir/*";
如果需要额外匹配以.开头的隐藏无扩展名文件,可以补充匹配规则:
# 匹配所有文件,过滤.和..特殊目录 my @all_files = grep { $_ ne '.' && $_ ne '..' } glob "$dir/.* $dir/*"; unlink grep { -f $_ } @all_files;
如果只需要删除无扩展名的普通文件,加一层正则过滤即可:
my @no_ext_files = grep { -f $_ && /^[^.]+$/ } glob "$dir/* $dir/.*"; unlink @no_ext_files;
方案2:修正readdir写法
补全完整路径再做测试,以下是删除所有无扩展名普通文件的示例:
my @file_list; opendir(my $dh, $dir) || die "can't opendir $dir: $!"; while (readdir $dh){ # 跳过特殊目录 next if $_ eq '.' || $_ eq '..'; # 拼接完整路径 my $full_path = "$dir/$_"; # 只保留无扩展名的普通文件 next unless -f $full_path && $_ !~ /\./; push @file_list, $full_path; } closedir $dh; unlink @file_list;
如果要删除目录下所有普通文件,去掉$_ !~ /\./的判断即可。
内容的提问来源于stack exchange,提问作者Albertus
相关产品推荐
相关产品推荐

