8

我有一个文件夹,它的名字是:

drwxr-xr-x.  2 user user       4096 Aug  2 18:30 folder name [www.website.com]

但是当我像这样使用 glob 时:

my @files = glob ("/home/user/Downloads/folder name [www.website.com]/*");
print "@files\n";

它没有列出目录中的文件,结果如下:

/home/user/Downloads/folder name

我试过像这样转义空格和方括号:

/home/user/Downloads/folder\ name\ \[www.website.com\]

但结果是一样的,我的错误可能是什么,或者我可以做些什么来改进我的代码?

提前致谢

4

2 回答 2

9

内置glob函数在空格处拆分模式。所以你正在做相当于

my @files = (
  glob("/home/user/Downloads/folder"),
  glob("name"),
  glob("[www.website.com]/*"),
);

转义空格和括号将是一种选择。但最好使用核心File::Glob模块进行更精细的控制:

use File::Glob ':bsd_glob';

my @files = bsd_glob("/home/user/Downloads/folder name \\[www.website.com\\]/*");

现在,只需要转义括号。这也覆盖了内置的 glob,因此您实际上不必更改代码,除了那个导入(当然还有模式)。

于 2013-09-25T15:35:18.470 回答
1

空格和方括号在 glob 模式中是特殊的。匹配

/home/user/Downloads/folder name [www.website.com]

你需要

/home/user/Downloads/folder\ name\ \[www.website.com\]

所以完整的模式是

/home/user/Downloads/folder\ name\ \[www.website.com\]/*

要构建该字符串,您可以使用字符串文字

"/home/user/Downloads/folder\\ name\\ \\[www.website.com\\]/*"

测试:

$ perl -E'say for glob "/home/eric/Downloads/folder\\ name\\ \\[www.website.com\\]/*"'
/home/eric/Downloads/folder name [www.website.com]/foo

请注意,空格不能在 Windows 中转义。你必须使用 File::Glob's bsd_glob。(它调用与 相同的函数glob,但具有不同的标志。)

use File::Glob qw( bsd_glob );
say for bsd_glob("C:\\Program Files\\*");
于 2013-09-25T16:29:15.013 回答