You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 01:57:05