gpt4 book ai didi

shell - 文件 glob() 什么时候理解 ** ?

转载 作者:行者123 更新时间:2023-12-04 23:26:35 25 4
gpt4 key购买 nike

在 Java7 中,sun.nio.fs.GlobsgetPathMatcher() 似乎将习语 ** 理解为跨越目录边界 (参见 the getPathMatcher javadoc)匹配零个或多个字符 的方式。

I could swear some flavor of shell (zsh, bash, tcsh) with some appropriate option settings was giving me the same behavior at some point.但是对于我的生活,我不记得如何启用它,我什至开始怀疑我的内存是否在某个时候工作过......(编辑:zsh 提供了这种行为,但仅适用于目录,即 "**.gz"不匹配 foo/bar/fubar.gz ,但 "**/*.gz" 匹配)。

事实上,查看 glob 的各种实现的文档(例如 POSIX glob(3)、glob(7) 和 Perl 的 File::Glob)似乎没有任何地方提到这种行为。一个异常(exception)是 Ruby 的 Dir.glob() ,它明确处理 **

(最初的问题是:“有谁知道如何在 unix shell(例如 zsh)中启用这种行为?”,但现在请参阅下面的已编辑问题)。

作为奖励问题:有人知道如何在 Google 中搜索 '**' 吗?...

编辑问题

事实上,看起来我的 zsh shell 确实接受了这种行为(感谢对这一事实的回应,并促使我进一步研究)。我认为它不是的原因来自以下微妙之处: "**.gz" 不会匹配 <path>/<prefix>.gz ,但 "**/*.gz" 会。这是一个例子。让我们从以下树开始:

$ find . -type f | sort
./foo/a.gz
./foo/bar/fubar/abc.gz
./foo/bar/x.gz
./foo/bar/y.gz
./xyz.gz
"**.gz" 在子目录内不匹配,只匹配 "*.gz "将:
$ ls -1 **.gz
xyz.gz

"**/*.gz" 则:
$ ls -1 **/*.gz
foo/a.gz
foo/bar/fubar/abc.gz
foo/bar/x.gz
foo/bar/y.gz
xyz.gz

现在,将其与 Java 行为进行比较:
@Test
public void testStar() {
String pat = Globs.toUnixRegexPattern("*.gz");
assertEquals("^[^/]*\\.gz$", pat);
}

@Test
public void testStarStar() {
// '**' allows any number of directories on the path
// this apparently is not POSIX, although darn useful
String pat = Globs.toUnixRegexPattern("**.gz");
assertEquals("^.*\\.gz$", pat);
}

很明显(来自正则表达式),这里的 "**" 匹配路径上的任何字符(即它在正则表达式中变为 ".*"),无论是否在子目录中,以及是否作为文件名的一部分。

(免责声明:Globssun.nio.fs.Globs.toUnixRegexPattern(String glob) 的副本,因为我需要一些跨平台的东西)。

最佳答案

POSIX shell :

The slash character in a pathname shall be explicitly matched by using one or more slashes in the pattern; it shall neither be matched by the asterisk or question-mark special characters nor by a bracket expression



你可以谷歌:“文件名扩展模式”。

在 bash 中你可以设置 globstar :

[An asterisk] Matches any string, including the null string. When the globstar shell option is enabled, and ‘*’ is used in a filename expansion context, two adjacent ‘*’s used as a single pattern will match all files and zero or more directories and subdirectories. If followed by a ‘/’, two adjacent ‘*’s will match only directories and subdirectories.


$ shopt -s globstar
$ ls **/
$ shopt -u globstar
$ ls **/

注意:此处使用“/”仅显示目录。

关于shell - 文件 glob() 什么时候理解 ** ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11974196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com