我有一个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.
我想迭代foo.log它的日志轮换兄弟姐妹foo.1.gz,foo.2.gz从最新到最旧,代码不会被存在所迷惑foo.bar
令人高兴的是,logrotate命名事物时,从最新到最旧的顺序和字母顺序都是相同的。
我最初的尝试是for f in $(ls -t foo.*); do ...但是shellcheck说Iterating 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.
我正在使用 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 之前的星号读取字符,或者您能解释一下吗?如果星号在括号中,该模式如何在否定括号之前找到匹配项?我将其想象为正则表达式。谢谢。
我有一个关于在 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)
任何帮助都会非常感谢
我试图在我的 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 不能处理变量,我该怎么做才能解决这个问题?
根据eslint no-restricted-imports 文档
使用对象形式时,您还可以指定gitignore 样式模式数组 :
Run Code Online (Sandbox Code Playgroud)"no-restricted-imports": ["error", { "paths": ["import1", "import2"], "patterns": ["import1/private/*", "import2/*", "!import2/good"] }]
(强调我的)
我想要做的是限制从父索引文件导入 - 因为这会导致循环依赖问题(我也在使用该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 样式模式中指定“字符串结尾”?
我正在尝试将一些代码从 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 控制台中测试它时,它似乎只列出子目录中的文件。以下都只列出子目录文件
$ 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)
我是否误解了所引用问题的答案,或者我是否错误地测试了模式?
如何确定脚本中的命令对当前目录和子目录中的文件进行操作?
不存在的目录上的递归 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)