我想在我的本地机器上复制位于远程机器上的文件,其文件名与前缀字符串匹配。
我试图只选择名称以massif
或者calgrind
使用以下命令开头的文件:
scp my-machine:/home/user/a-folder/[massif,callgrind]* .
但是,此表达式允许匹配空字符串加上任意数量的字符,因此匹配与目录相关的所有文件名。
我必须进行哪些更改才能使其正常工作?
我想在我的本地机器上复制位于远程机器上的文件,其文件名与前缀字符串匹配。
我试图只选择名称以massif
或者calgrind
使用以下命令开头的文件:
scp my-machine:/home/user/a-folder/[massif,callgrind]* .
但是,此表达式允许匹配空字符串加上任意数量的字符,因此匹配与目录相关的所有文件名。
我必须进行哪些更改才能使其正常工作?
听起来你想要花括号:
否则,您将匹配单个字符,而不是两个完整的字符串。
bash
进行许多不同类型的扩展和替换;这些都记录在 bash 手册页中 - 查找该EXPANSION
部分。在这里,该[
类型包含在“路径名扩展”(它匹配路径名)和{
“大括号扩展”下(它从提供的选项生成多个参数,无论文件是否存在)。可以使用两种方法选择文件:可以连续或连续指定模式。
第一种方法
此方法需要使用Bash 扩展模式来指定多个模式。用户必须使用内置函数 (cf builtin
extglob
) 启用shell 选项,因为默认情况下不启用 Bash 扩展模式。shopt
shopt
Bash 子模式
@(PATTERN-LIST)
允许指定由 . 分隔的一个或多个模式的列表|
。它匹配给定模式之一。例如,@(foo|bar)
匹配foo
或bar
不匹配foobar
,barfoo
,foofoo
,barbar
。glob 星匹配任何字符串,包括空字符串。因此,该模式匹配所有以or (前缀(子)字符串)
@(foo|bar)*
开头的文件名。foo
bar
当远程 shell 是 Bash 并且启用了它的
extglob
shell 选项时,此方法有效。~/.bash_profile
用户可以在远程机器上的配置文件(例如)中启用这个 Bash 选项。第二种方法
此方法多次执行具有不同参数的相同命令。它使用符合 POSIX 的 shell 工作。
大括号扩展
此方法不可靠,因为结果表达式可能指定不存在的文件名。