假设你有一个文件夹,你要删除里面类似这样命名的文件 :
/path/to/dir/000000 - Smooth Faker
/path/to/dir/000000 - Rubber Hocker
...
在 perl 里你可以用很多方法得到这样的文件列表(),诸如opendir后grep, find函数,当然还有更容易让shell迷想起的glob函数。 不过关于glob函数,这里有个很大的陷阱,如果不注意他将可能导致灾难后果,比如:
unlink glob("/path/to/dir/000000 - *");
看上去似乎没问题,但这个危险的操作可以删除你当前文件下的的所有文件。
让我们仔细看文档, perldoc File::Glob :
Since v5.6.0, Perl’s CORE::glob() is implemented in terms of
bsd_glob(). Note that they don’t share the same
prototype--CORE::glob() only accepts a single argument. Due to
historical reasons, CORE::glob() will also split its argument on
whitespace, treating it as multiple patterns, whereas bsd_glob()
considers them as one pattern.
也就是说,这里的 glob 操作变成了, File::Glob::bsd_glob("/path/to/dir/00000", "-", "*"), 你将会删掉'*'匹配的所有文件。解决办法是用双引号括起整个部分,或者使用File::Glob::bsd_glob。
按理这个是已经在文档中说明了,不应该算是陷阱,不过如果你仅仅用 perldoc -f glob 查看,那么并没有类似的说明和警告而是让你转而看 File::Glob 的说明。(常常的)偷懒和想当然的结果就是,忽视了这里最大的一个可能引爆的漏洞。所以这里的建议是不使用glob而是使用File::Glob::bsd_glob。
阅读(2287) | 评论(0) | 转发(0) |