标签: glob

Bash globbing - 针对一些特定情况的autoexpand?

我知道通配符*(单独)将以这样一种方式扩展,即它意味着"当前文件夹中的所有非隐藏文件",其中隐藏文件是以句点为前缀的文件.

我认为有两个用例是有用的,但我不知道如何正确地做:

  1. 你怎么能为......"当前文件夹中的所有文件,包括隐藏文件,但不包括..."?

  2. 你怎么能为......"所有隐藏文件(和隐藏文件)在当前文件夹中,但不包括..."?

bash filenames glob expansion

10
推荐指数
1
解决办法
2926
查看次数

PHP全局风格匹配

为了简短起见,我写了一个访问控制系统.

该系统的要求之一是通过将其与模式匹配来检查是否可以访问规范/规范化路径.

首先想到的是PREG,问题是,模式是基于文件的,即类似于接受的模式glob().基本上,它只是包含?(匹配一个任意字符)或*(匹配任何字符)的模式.

所以简单来说,我需要glob()在PHP上重新创建匹配功能.

示例代码:

function path_matches($path, $pattern){
    // ... ?
}

path_matches('path/index.php', 'path/*');        // true
path_matches('path2/', 'path/*');                // false
path_matches('path2/test.php', 'path2/*.php');   // true
Run Code Online (Sandbox Code Playgroud)

一个可能的解决方案是转换$pattern为正则表达而不是使用preg_match(),有没有其他方法?

注意:我不能使用正则表达式的原因是模式将由非程序员编写.

php glob path pattern-matching

10
推荐指数
3
解决办法
4438
查看次数

为什么我们需要SQLite中的GLOB子句?

我是一名Android开发人员,最近在SQLite中遇到了GLOB子句.我不明白为什么我们需要GLOB,因为LIKE已经到位了.

这两个子句都有通配符来表示单个和多个字符.唯一的区别是GLOB区分大小写.

但这就是全部吗?LIKE是一个不好或不恰当的选择吗?在任何情况下我们绝对必须使用GLOBE vs LIKE,反之亦然?

sql sqlite glob android-sqlite sql-like

10
推荐指数
1
解决办法
4197
查看次数

为什么Perl的glob()函数在给定没有通配字符的字符串时总是返回文件名?

我给Perl的glob函数提供了一个globs列表和一个字符串.球体按预期处理,但始终找到弦.例如:

$ ls
foo
$ perl -le '@files=glob("*bar"); print @files' ## prints nothing, as expected
$ perl -le '@files=glob("bar"); print @files'
bar
Run Code Online (Sandbox Code Playgroud)

如上所示,bar即使没有这样的文件,第二个示例也会打印出来.

我的第一个想法是它的行为就像shell一样,当没有可用的扩展时,一个glob(或被视为glob的东西)扩展到自己.例如,在csh(可怕的是,这是Perl的glob()功能似乎如下,请参阅下面的引用):

% foreach n (*bar*)
foreach: No match.

% foreach n (bar)
foreach? echo $n
foreach? end
bar                     ## prints the string
Run Code Online (Sandbox Code Playgroud)

但是,根据文档,glob应该返回文件名扩展(强调我的):

在列表上下文中,返回EXPR值的文件名扩展(可能为空)列表,例如标准的Unix shell/bin/csh.

那么为什么在传递给参数的参数中没有通配符时它会返回glob?这是一个错误还是我做错了什么?

perl glob

10
推荐指数
2
解决办法
852
查看次数

为什么glob.glob和pathlib.Path.glob对隐藏文件的处理方式不同?

考虑此文件夹包含两个文件:

test/
    foo
    .bar
Run Code Online (Sandbox Code Playgroud)

调用glob.glob('*')此文件夹不会列出隐藏.bar文件:

>>> glob.glob('test/*')
['test/foo']
Run Code Online (Sandbox Code Playgroud)

但是pathlib.Path.glob('*')会:

>>> list(Path('test').glob('*'))
[PosixPath('test/.bar'), PosixPath('test/foo')]
Run Code Online (Sandbox Code Playgroud)

我想知道这是故意的还是可能的错误/疏忽。


glob模块的文件指出,以点开头的文件是特殊的套管:

glob将以点(。)开头的文件名视为特殊情况

表示给出的结果glob.glob('*')是预期的。但是pathlib glob呢?我在文档中找不到任何相关信息。这是预期的行为吗?两种功能都不能产生相同的结果吗?

python glob hidden-files

10
推荐指数
1
解决办法
867
查看次数

gitignore的类似正则表达式的shell glob模式

当我编译我的C++项目时,许多共享对象文件都是使用扩展名创建的

.so
.so.0
.so.7
.so.0.7
Run Code Online (Sandbox Code Playgroud)

我需要将所有这些添加到我的.gitignore文件中.如果这是一个正则表达式,我可以使用

\.so[\.0-9]*
Run Code Online (Sandbox Code Playgroud)

但是,文档说明了这一点.gitignore

将模式视为适合fnmatch(3)使用FNM_PATHNAME标志的shell glob

我找不到用fnmatch我发现的文件做我想做的事情.真的没办法做到这一点吗?

git glob gitignore

9
推荐指数
2
解决办法
4522
查看次数

循环结果来自Path.glob()(Pathlib)

我正在努力解决Python 3.6中Pathlib模块的Path.glob()方法的结果.

from pathlib import Path

dir = Path.cwd()

files = dir.glob('*.txt')
print(list(files))
>> [WindowsPath('C:/whatever/file1.txt'), WindowsPath('C:/whatever/file2.txt')]

for file in files:
    print(file)
    print('Check.')
>>
Run Code Online (Sandbox Code Playgroud)

显然,glob找到了文件,但是没有执行for循环.如何循环pathlib-glob-search的结果?

python glob pathlib

9
推荐指数
1
解决办法
5694
查看次数

在meld比较中仅包括特定的文件模式

我想比较目录与Meld,但只有特定的文件模式.例如,只有*.c;*.cc;*.icc;*.h文件.

Meld可以使用文件过滤器,但我只能使用它们来排除过滤特定的文件模式.我想这种方法对我没用.

可以应用包含过滤器吗?

我尝试了"双重否定"的概念:排除"除了"之外的所有*.c;*.cc;*.icc;*.h内容,实际上只包括那些模式.
我尝试使用文件过滤器,它可以很好地ls -d -- <my_filter>在命令行中列出"除了...之外的所有内容" (请参阅此内容).我认为这是任何过滤器在Meld中工作的必要条件(但不是充分条件).这些都不起作用:

  1. !(*.c|*.h|*.cc)
  2. !(*@(.c|.h|.cc))
  3. !(*.@(c|h|cc))

注意:我不是要使用任何类型的文本过滤器,因为我现在不关心文件的内容,而只关心文件名.

注意:我有bash

$ shopt extglob
extglob on
Run Code Online (Sandbox Code Playgroud)

filtering glob wildcard meld

9
推荐指数
0
解决办法
346
查看次数

多个目录上的Glob Sync Pattern

我正在尝试实现一个glob允许我满足以下条件的同步模式,但不幸的是,我很难解决为什么模式不起作用.

全球模式

glob.sync("./src/handlebar/{a, b, c, d}/**/*.hbs")

文件路径模式

src/handlebar/b/a/header.hbs
src/handlebar/b/header.hbs
src/handlebar/a/head.hbs [MATCH]
src/handlebar/a/foot.hbs [MATCH]
src/handlebar/c/a/something.hbs
src/handlebar/d/a/button.hbs
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

javascript regex glob

9
推荐指数
1
解决办法
2916
查看次数

从 GitHub 存储库克隆/下载特定文件

GitHub 上有一个名为platform_frameworks_base的 Git 存储库,其中包含部分 Android 源代码。
我编写了一个应用程序,该应用程序会回复该项目中的所有 .aidl 文件,因此它会在第一次启动时下载所有文件。
到目前为止,我通过从项目根目录下载文件Android.bp,从该文件中提取所有以 .aidl 结尾的文件路径,然后明确地将它们一一下载。

例如,如果我找到了这个文件路径:

media/java/android/media/IAudioService.aidl
Run Code Online (Sandbox Code Playgroud)

我知道我可以像这样下载它:

wget https://raw.githubusercontent.com/aosp-mirror/platform_frameworks_base/android-10.0.0_r47/media/java/android/media/IAudioService.aidl
Run Code Online (Sandbox Code Playgroud)

在 Android 10 (git tag: android-10.0.0_r47)之前,这可以正常工作。
从 Android 11(例如 git tag: android-11.0.0_r33)开始,文件路径使用通配符而不是完整路径。看到这个Android.bp

它现在只包含通配符/glob 文件路径,如:

media/java/**/*.aidl
location/java/**/*.aidl
Run Code Online (Sandbox Code Playgroud)

等等...

我目前的“解决方案”:

  1. 克隆 repo(仅我们关心的分支的最后一次提交):

    git clone --depth=1 -b android-11.0.0_r33 https://github.com/aosp-mirror/platform_frameworks_base.git

  2. 从 Android.bp 中提取通配符/glob 路径。

    cat Android.bp | grep '\.aidl"' | cut -d'"' -f2

  3. 查找与通配符/glob 路径匹配的所有文件。

    例如 shopt -s globstar && echo media/java/**/*.aidl

但是下载过程需要很长时间,因为存储库包含超过 1 GB的二进制文件。即使我只是克隆我关心的分支的最后一次提交。

现在我的实际问题是:
我怎样才能下载.aidl …

git bash glob github

9
推荐指数
2
解决办法
271
查看次数