标签: glob

zsh究竟如何扩展globs?

我有一个C程序通过迭代argv变量显示它的命令行.

#include <stdio.h>

int main(int argc, char *argv[]){
    int i = 0;
    printf("----------\n");
    for(i = 0; i < argc; i++)
        printf("%s\n", argv[i]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我在包含大型C++源代码树的文件夹中调用该程序,如下所示:

./a.out **/*.h
Run Code Online (Sandbox Code Playgroud)

输出:

zsh: argument list too long: ./a.out
Run Code Online (Sandbox Code Playgroud)

但是,当使用同一文件夹中的glob 调用时,程序喜欢ls并且grep没有任何问题**/*.h.为什么zsh在调用我的程序时会失败?如何zsh扩展通配符?

编辑:我在cygwin上使用zsh.

command-line zsh glob wildcard

6
推荐指数
1
解决办法
1140
查看次数

POSIX glob -- 如何匹配一个或多个 [:digit:]

我想迭代foo.log它的日志轮换兄弟姐妹foo.1.gzfoo.2.gz从最新到最旧,代码不会被存在所迷惑foo.bar

令人高兴的是,logrotate命名事物时,从最新到最旧的顺序和字母顺序都是相同的。

我最初的尝试是for f in $(ls -t foo.*); do ...但是shellcheckIterating over ls output is fragile. Use globs. [SC2045]。另外,此代码匹配foo.bar不需要的内容。

但是如何将任意数量的数字与全局模式匹配呢?(或者这是不支持的?)我只知道如何明确列出每个数字。例如,以下处理 1 和 2 位数字并正确排除foo.1bar.gz但不处理foo.123.gz(并且我没有做正确的事情来导致globing 发生!)

for f in foo.log foo.[[:digit:]].gz foo.[[:digit:]][[:digit:]].gz; do ...

我可以假设没有人保留超过 100 个日志轮换的兄弟姐妹,但我不想这样做。

正在寻找符合 POSIX 标准的解决方案...

编辑:logrotate conf 会压缩某些文件,但不会压缩其他文件。所以并不是所有的兄弟姐妹都会以.gz.

linux posix glob sh

6
推荐指数
1
解决办法
9968
查看次数

全局否定如何工作?

我正在使用 gulp 并且不理解以下 glob 模式的方法:

'./bower_components/**/!(*.min).css'
Run Code Online (Sandbox Code Playgroud)

它选择除最小后缀文件之外的所有 css 文件。如果它是正则表达式,它会编译成什么?

我明白为什么'./bower_components/**/*!(.min).css'表单不起作用,但我仍然不明白为什么不需要在前面加星号,.css例如:

'./bower_components/**/!(*.min)*.css'
Run Code Online (Sandbox Code Playgroud)

.min 之前的星号读取字符,或者您能解释一下吗?如果星号在括号中,该模式如何在否定括号之前找到匹配项?我将其想象为正则表达式。谢谢。

linux glob gruntjs gulp

6
推荐指数
1
解决办法
6396
查看次数

Python 的 glob 模块中的 Unix glob 样式模式是否区分大小写?

我不熟悉全局模式​​样式,根据本教程,它说glob区分大小写。

然而,当我使用globPython中的模块时,它似乎glob.glob('./M*')返回glob.glob('./m*')相同的结果,也就是说,Pythonglob是区分大小写,见下文(我将结果一起打印以确保它们是串联执行的),

在此输入图像描述

如何区分大写和小写?为此我是否必须诉诸字符串方法?

python unix glob python-3.x

6
推荐指数
1
解决办法
1492
查看次数

Python 全局路径问题

我有一个关于在 python 中使用 glob 的问题。

我想知道为什么路径显示反斜杠而不是正斜杠?

示例为 C:/Users/Name/Desktop/Pythonfiles\excel.xlsx

我的脚本是

import glob
excel_list = (glob.glob("C:/Users/Name/Desktop/Pythonfiles/*.xlsx"))
Run Code Online (Sandbox Code Playgroud)

这是我得到的输出:

['C:/Users/Name/Desktop/PythonFiles\\19282.xlsx', 'C:/Users/Name/Desktop/PythonFiles\\19557.xlsx', 'C:/Users/Name/Desktop/PythonFiles\\19667.xlsx', 'C:/Users/Name/Desktop/PythonFiles\\19742.xlsx', 'C:/Users/Name/Desktop/PythonFiles\\CEImport.xlsx']
Run Code Online (Sandbox Code Playgroud)

任何帮助都会非常感谢

python glob

6
推荐指数
1
解决办法
1万
查看次数

Perl Globbing a Variable 在第一场比赛中停止

我试图在我的 Perl 目录中循环一些文件。假设我当前的目录包含:song0.txt、song1.txt、song2.txt、song3.txt、song4.txt。

我提供“song?.txt”作为我程序的参数。

当我做:

foreach $file (glob "$ARGV[0]") {
    printf "$file\n";
}
Run Code Online (Sandbox Code Playgroud)

它在打印“song0.txt”后停止。

但是,如果我将“$ARGV[0]”替换为“song?.txt”,它会按预期打印出所有 5 个。为什么 Perl glob 不能处理变量,我该怎么做才能解决这个问题?

perl glob command-line-arguments

6
推荐指数
1
解决办法
155
查看次数

eslint no-restricted-imports - 防止从以模式结尾的路径导入

根据eslint no-restricted-imports 文档

使用对象形式时,您还可以指定gitignore 样式模式数组 :

"no-restricted-imports": ["error", {
    "paths": ["import1", "import2"],
    "patterns": ["import1/private/*", "import2/*", "!import2/good"] }]
Run Code Online (Sandbox Code Playgroud)

(强调我的)

我想要做的是限制从父索引文件导入 - 因为这会导致循环依赖问题(我也在使用该import/no-cycle规则,但也显式使用该规则是有意义的。)

也就是说,我想禁止进口,如:

import foo from "../.."; 
import bar from "../../.."; 
Run Code Online (Sandbox Code Playgroud)

我还想禁止进口,如:

import a from "../Components"; 
Run Code Online (Sandbox Code Playgroud)

但不喜欢

import  b from "../Components/Foo"; 
Run Code Online (Sandbox Code Playgroud)

我曾尝试使用此规则:

'no-restricted-imports': [
  'error', 
  {
    patterns: [
      '**/..', 
      '**/Components'
    ]
  }, 
Run Code Online (Sandbox Code Playgroud)

但这会导致导入错误:

import  b from "../Components/Foo"; 
Run Code Online (Sandbox Code Playgroud)

有没有办法在 gitignore 样式模式中指定“字符串结尾”?

glob gitignore eslint

6
推荐指数
1
解决办法
1845
查看次数

为什么这个参数扩展替换在 bash 4.2 中失败但在 5.1 中有效?

我正在尝试将一些代码从 bash 5.1 移植到 4.2.46。一个尝试从特定格式的字符串中去除颜色代码的函数停止工作。

text这是这种格式的示例字符串。我为此打开了扩展通配符。

text="$(printf -- "%b%s%b" "\[\e[31m\]" "hello" "\[\e[0m\]")"
shopt -s extglob
Run Code Online (Sandbox Code Playgroud)

在 bash 5.1 中,此参数扩展可删除所有颜色代码和转义字符

bash-5.1$ echo "${text//$'\[\e'\[/}"
31m\]hello0m\]
bash-5.1$ echo "${text//$'\[\e'\[+([0-9])/}"
m\]hellom\]
bash-5.1$ echo "${text//$'\[\e'\[+([0-9])m$'\]'/}"
hello
Run Code Online (Sandbox Code Playgroud)

在 bash 4.2.46 中,当我构建参数扩展时,我开始出现不同的行为。

bash-4.2.46$ echo "${text//$'\[\e'\[/}"
\31m\]hello\0m\]
bash-4.2.46$ echo "${text//$'\[\e'\[+([0-9])/}"
\[\]hello\[\]  ## no longer matches because `+([0-9])` doesn't follow `\[`
Run Code Online (Sandbox Code Playgroud)

差异来自于这一行:echo "${text//$'\[\e'\[/}"

bash-5.1:    31m\]hello0m\]
bash-4.2.46: \31m\]hello\0m\]
Run Code Online (Sandbox Code Playgroud)

显示内容如下printf "%q" "${text//$'\[\e'\[/}"

bash-5.1:    31m\\\]hello0m\\\]
bash-4.2.46: \\31m\\\]hello\\0m\\\]
Run Code Online (Sandbox Code Playgroud)

4.2.26 中的额外内容从哪里来\

即使当我尝试删除它时,模式也会停止匹配:

bash-5.1:    31m\]hello0m\]
bash-4.2.46: \31m\]hello\0m\]
Run Code Online (Sandbox Code Playgroud)

我猜测可能存在与参数扩展、反斜杠转义和扩展通配符相关的错误。

我的目标是编写适用于 …

bash glob parameter-expansion

6
推荐指数
2
解决办法
209
查看次数

双星号是否包含当前目录?

以下问题询问双星号 (**) 通配符是什么意思?

那里的许多答案表明**包括当前目录以及子目录。

但是,当我在 bash 控制台中测试它时,它似乎只列出子目录中的文件。以下都只列出子目录文件

$ find **/*.md
docs/architecture.md
docs/autodetect.md
# ...

$ ls -d **/*.md
docs/architecture.md
docs/autodetect.md
# ...
Run Code Online (Sandbox Code Playgroud)

尽管当前目录中有.md文件

$ ls -d *.md
CODE_OF_CONDUCT.md  CONTRIBUTING.md  README.md  SECURITY.md
Run Code Online (Sandbox Code Playgroud)

我是否误解了所引用问题的答案,或者我是否错误地测试了模式?

如何确定脚本中的命令对当前目录和子目录中的文件进行操作?

bash glob

6
推荐指数
1
解决办法
818
查看次数

使用“**”模式的递归 glob.glob 出现意外结果

不存在的目录上的递归 glob 结果:

>>> import os, glob
>>> os.path.exists('dir')
False

>>> glob.glob('dir/*', recursive=True)
[]

>>> glob.glob('dir/**', recursive=True)
['dir/']

Run Code Online (Sandbox Code Playgroud)

现有文件的递归 glob 结果作为目录返回:

>>> os.path.exists('file')
True

>>> glob.glob('file/*', recursive=True)
[]

>>> glob.glob('file/**', recursive=True)
['file/']

Run Code Online (Sandbox Code Playgroud)

使用 bash shell 补全的类似命令将产生以下输出:

$ shopt -s globstar failglob

$ ls dir
ls: cannot access 'dir': No such file or directory
$ echo dir/*
-bash: no match: dir/*
$ echo dir/**
-bash: no match: dir/**

$ touch file
$ echo file/*
-bash: no match: file/*
$ echo file/** …
Run Code Online (Sandbox Code Playgroud)

python glob

6
推荐指数
0
解决办法
170
查看次数