如何删除没有扩展名的文件?



如何删除没有扩展名的文件?

我使用草莓Perl 5.32.1.1 64位版本。以下是我的文件:

unlink glob "$dir/*.*";

我还尝试了以下方法:

my @file_list;
opendir(my $dh, $dir) || die "can't opendir $dir: $!";
while (readdir $dh){
next unless -f;    
push @file_list, $_;
}
closedir $dh;
unlink @file_list;

这样做的结果是所有带有扩展名的文件都被删除,
但是那些没有扩展名的文件保持不被删除。

你没有真正解释问题是什么,所以这只是一个猜测。

您使用readdir()获取要删除的文件列表,然后将该列表传递给unlink()。这里的问题是,您从readdir()返回的文件名不包括您最初传递给readdir()的目录名。所以你需要像这样填充数组:

push @file_list, "$dir/$_";

在评论中你说:

我测试分离水珠"$ dir/";但是没有扩展名的文件不被删除。

嗯,如果你仔细想想,你只要求文件的扩展名。如果你传递给glob()的模式包含*.*,那么它将只返回与该模式匹配的文件(即带有点和点后更多文本的文件)。

解决方案似乎是简化你传递给glob()的模式,所以它只是*

unlink glob "$dir/*";

当然,也会尝试删除目录,所以您可能想要这样做:

unlink grep { -f } glob "$dir/*";

您期望glob执行类似dos的globing,但是glob函数提供类似csh的globing。

  • glob("*.*")匹配所有包含.的文件,忽略以点开头的文件。
  • glob("*")匹配所有文件,忽略以圆点开头的文件。
  • glob("* .*")匹配所有文件

注意,所有类型的文件都是匹配的。这包括目录。需要特别注意的是,...是由.*匹配的。

如果你想要dos风格的globs,你可以使用File::DosGlob.

是的,您可以使用glob,但是您需要做更多的工作。Grep可以帮助您选择要查找的文件。

*抓取所有条目(不以点开头),-f只选择文件,!/./删除名称中带点的文件:

unlink grep {!/./} grep {-f} glob "$dir/*";

最新更新