如何删除没有文件扩展名的文件?
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。
如何删除没有文件扩展名的文件?
我正在使用 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。