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

How do you delete a file that does not have a file extension?

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

我正在使用 Strawberry 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/$_";

在评论中您说:

I'm testing unlink glob "$dir/."; but the files without file extensions are not deleted.

好吧,如果您考虑一下,您只是在请求具有扩展名的文件。如果您传递给 glob() 的模式包含 *.*,那么它只会 return 匹配该模式的文件(即带点的文件和点后的更多文本)。

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

unlink glob "$dir/*";

当然,这也会尝试删除目录,所以您可能需要这个:

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

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

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

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

您希望 glob 执行类似 DOS 的通配,但 glob 函数提供了 csh 类似的通配。

  • glob("*.*") 匹配所有包含 . 的文件,忽略带有前导点的文件。
  • glob("*") 匹配所有文件,忽略带前导点的文件。
  • glob("* .*") 匹配所有文件。

注意每一种文件都是匹配的。这包括目录。特别要注意 ....*.

匹配

如果你想要 DOS 风格的 glob,你可以使用 File::DosGlob