我知道通配符*(单独)将以这样一种方式扩展,即它意味着"当前文件夹中的所有非隐藏文件",其中隐藏文件是以句点为前缀的文件.
我认为有两个用例是有用的,但我不知道如何正确地做:
你怎么能为......"当前文件夹中的所有文件,包括隐藏文件,但不包括.或.."?
你怎么能为......"所有隐藏文件(和隐藏文件)在当前文件夹中,但不包括.或.."?
为了简短起见,我写了一个访问控制系统.
该系统的要求之一是通过将其与模式匹配来检查是否可以访问规范/规范化路径.
首先想到的是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(),有没有其他方法?
注意:我不能使用正则表达式的原因是模式将由非程序员编写.
我是一名Android开发人员,最近在SQLite中遇到了GLOB子句.我不明白为什么我们需要GLOB,因为LIKE已经到位了.
这两个子句都有通配符来表示单个和多个字符.唯一的区别是GLOB区分大小写.
但这就是全部吗?LIKE是一个不好或不恰当的选择吗?在任何情况下我们绝对必须使用GLOBE vs LIKE,反之亦然?
我给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?这是一个错误还是我做错了什么?
考虑此文件夹包含两个文件:
test/
foo
.bar
Run Code Online (Sandbox Code Playgroud)
调用glob.glob('*')此文件夹不会列出隐藏.bar文件:
>>> glob.glob('test/*')
['test/foo']
Run Code Online (Sandbox Code Playgroud)
>>> list(Path('test').glob('*'))
[PosixPath('test/.bar'), PosixPath('test/foo')]
Run Code Online (Sandbox Code Playgroud)
我想知道这是故意的还是可能的错误/疏忽。
该glob模块的文件指出,以点开头的文件是特殊的套管:
glob将以点(。)开头的文件名视为特殊情况
表示给出的结果glob.glob('*')是预期的。但是pathlib 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我发现的文件做我想做的事情.真的没办法做到这一点吗?
我正在努力解决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的结果?
我想比较目录与Meld,但只有特定的文件模式.例如,只有*.c;*.cc;*.icc;*.h文件.
Meld可以使用文件过滤器,但我只能使用它们来排除过滤特定的文件模式.我想这种方法对我没用.
可以应用包含过滤器吗?
我尝试了"双重否定"的概念:排除"除了"之外的所有*.c;*.cc;*.icc;*.h内容,实际上只包括那些模式.
我尝试使用文件过滤器,它可以很好地ls -d -- <my_filter>在命令行中列出"除了...之外的所有内容" (请参阅此内容).我认为这是任何过滤器在Meld中工作的必要条件(但不是充分条件).这些都不起作用:
!(*.c|*.h|*.cc)!(*@(.c|.h|.cc))!(*.@(c|h|cc))注意:我不是要使用任何类型的文本过滤器,因为我现在不关心文件的内容,而只关心文件名.
注意:我有bash和
$ shopt extglob
extglob on
Run Code Online (Sandbox Code Playgroud) 我正在尝试实现一个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)
我究竟做错了什么?
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)
等等...
我目前的“解决方案”:
克隆 repo(仅我们关心的分支的最后一次提交):
git clone --depth=1 -b android-11.0.0_r33 https://github.com/aosp-mirror/platform_frameworks_base.git
从 Android.bp 中提取通配符/glob 路径。
cat Android.bp | grep '\.aidl"' | cut -d'"' -f2
查找与通配符/glob 路径匹配的所有文件。
例如 shopt -s globstar && echo media/java/**/*.aidl
但是下载过程需要很长时间,因为存储库包含超过 1 GB的二进制文件。即使我只是克隆我关心的分支的最后一次提交。
现在我的实际问题是:
我怎样才能下载.aidl …