glob无法识别带方括号的文件名

时间:2013-09-25 15:30:08

标签: perl

我有一个文件夹,名称是:

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\]

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

提前致谢

2 个答案:

答案 0 :(得分:9)

内置glob函数在空格处分割模式。所以你正在做一些等同于

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

转义空格和括号将是一个选项。但最好使用核心File::Glob module来实现更好的控制:

use File::Glob ':bsd_glob';

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

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

答案 1 :(得分:1)

Spaces和square brackers在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的bsd_glob。 (它调用的函数与glob相同,但标记不同。)

use File::Glob qw( bsd_glob );
say for bsd_glob("C:\\Program Files\\*");