当在bash脚本中执行以下两行代码时,"ls"会抱怨文件不存在:
dirs=/content/{dev01,dev02}
ls -l $dirs
Run Code Online (Sandbox Code Playgroud)
当我使用-x选项运行脚本时,它似乎是在单引号内传递变量(这会阻止globbing):
+ dirs=/content/{dev01,dev01}
+ ls -l '/content/{dev01,dev01}'
ls: /content/{dev01,dev01}: No such file or directory
Run Code Online (Sandbox Code Playgroud)
如果我从交互式shell(无引号)执行"ls"命令,它将返回两个目录.
我一直在阅读Bash参考手册(第3.2版)并且看不到任何原因导致文件名通配不发生(我没有将-f传递给shell),或者我可以设置的任何东西以确保全球化发生了.
我想要一个目录中的所有CSV文件,所以我使用
glob('my/dir/*.CSV')
Run Code Online (Sandbox Code Playgroud)
但是,这不会找到具有小写CSV扩展名的文件.
我可以用
glob('my/dir/*.{CSV,csv}', GLOB_BRACE);
Run Code Online (Sandbox Code Playgroud)
但有没有办法允许所有混合案例版本?或者这只是一个限制glob()?
我希望能够将glob格式中的模式匹配到字符串列表,而不是文件系统中的实际文件.有没有办法做到这一点,或将glob模式轻松转换为正则表达式?
我正在使用以下脚本,它使用case语句来查找服务器.
#!/bin/bash
SERVER=$1;
echo $SERVER | egrep "ws-[0-9]+\.host\.com";
case $SERVER in
ws-[0-9]+\.host\.com) echo "Web Server"
;;
db-[0-9]+\.host\.com) echo "DB server"
;;
bk-[0-9]+\.host\.com) echo "Backup server"
;;
*)echo "Unknown server"
;;
esac
Run Code Online (Sandbox Code Playgroud)
但它没有用.正则表达式正在与egrep合作,但不与案例合作.样本O/P.
./test-back.sh ws-23.host.com
ws-23.host.com
Unknown server
Run Code Online (Sandbox Code Playgroud)
任何的想法 ?
我需要列出名称以'SomeLongString'开头的所有文件.但'SomeLongString'的情况可能会有所不同.怎么样?
我正在使用zsh,但也欢迎使用bash解决方案.
我遇到过只支持glob样式模式并且不存在完整正则表达式支持的情况,例如redis键.我想知道两者之间的区别.另外它让我想知道,与一些软件根本不支持正则表达式的glob-style模式相比,实现正则表达式匹配算法更难?
我的Makefile中的一条规则将整个目录(res/)压缩为ZIP文件.显然,当目录下的任何文件res/发生更改时,需要执行此规则.因此,我希望规则将该目录下的所有文件作为先决条件.我该如何实施这条规则?
在启用了globstar选项的 Bash中,您可以使用通配符模式获取该目录中所有文件的列表res/**/*.但是,如果将其指定为Makefile中的先决条件,它似乎不起作用:
filename.jar: res/**/*
Run Code Online (Sandbox Code Playgroud)
即使在touch输入文件后res/,仍然可以生成报告
make: `filename.jar' is up to date.
Run Code Online (Sandbox Code Playgroud)
很明显它没有认识到这种模式.
如果我将目录本身声明为先决条件:
filename.jar: res
Run Code Online (Sandbox Code Playgroud)
然后在修改文件时不会重新执行Make(我认为make只查看目录本身的修改日期,只有在添加,删除或重命名直接子项时才会更改).
我试图用ER (扩展正则表达式),与ls喜欢ls .+\..+.
我正在尝试打印包含扩展名的所有文件(我知道我可以使用ls *.*,但我想尝试使用ER).
当我运行该代码时,我收到此错误:ls: .+..+: No such file or directory.
我正在使用npm模块node-glob.
此代码段以递归方式返回当前工作目录中的所有文件.
var glob = require('glob');
glob('**/*', function(err, files) {
console.log(files);
});
Run Code Online (Sandbox Code Playgroud)
样本输出:
[ 'index.html', 'js', 'js/app.js', 'js/lib.js' ]
Run Code Online (Sandbox Code Playgroud)
我想排除的index.html和JS/lib.js.我试图用负面模式排除这些文件'!' 但没有运气.有没有办法只通过使用模式来实现这一目标?
我知道glob可以查找文件夹中的所有文件或仅查找所有目录:
echo "All files:\n";
$all = glob("/*");
var_dump($all);
echo "Only directories\n";
$dirs = glob("/*", GLOB_ONLYDIR);
var_dump($dirs);
Run Code Online (Sandbox Code Playgroud)
但我没有找到能够有效地在一行中找到文件的东西.
$files = array_diff(glob("/*"), glob("/*", GLOB_ONLYDIR));
Run Code Online (Sandbox Code Playgroud)
运行良好,但两次读取目录(即使有一些优化使第二次浏览更快).