RHEL下Bash脚本SCP正则匹配文件异常,求助获取te开头文件
问题分析与解决
核心错误点
- 脚本语法错误:你修改后的scp命令把目标路径
${2}直接拼到了远程源路径里,变成了oracle@server1:/home/oracle/[te]*/tmp/,完全不符合scp的语法要求(scp需要明确区分源路径和目标路径),这是导致异常的直接原因之一。 - 混淆Shell通配符与正则表达式:你使用的
[te]*是Shell通配符,不是正则表达式。在Shell规则中,[te]*表示匹配第一个字符是t或e的任意文件,所以e开头的ef345、et123都会被匹配到,和你想要的“以te开头”的需求完全不符。
解决步骤
1. 修正scp命令的语法错误
把错误的scp行改回正确格式,确保源路径和目标路径是两个独立参数:
# 正确写法:源路径与目标路径分开传递 scp "oracle@${3}:${1}${4}" "${2}" >> /tmp/GetFile.log.$$ 2>&1
如果要避免本地Shell提前解析通配符(比如本地存在同名文件时),可以把远程路径里的通配符用单引号包裹,让远程Shell来处理匹配:
scp "oracle@${3}:${1}'${4}'" "${2}" >> /tmp/GetFile.log.$$ 2>&1
2. 用正确规则匹配以te开头的文件
- 用Shell通配符直接匹配:如果只需要简单的前缀匹配,直接用
te*即可(表示以te开头、后面跟任意字符的文件),运行命令:./GetFilev3 /home/oracle/ /tmp/ server1 "te*" - 用正则表达式精准筛选:如果需要更复杂的匹配规则,先通过ssh在远程服务器筛选目标文件,再逐个scp下载,示例代码替换原scp行:
这里ssh "oracle@${3}" "cd ${1} && ls -1 | grep '^te'" | while read -r file; do scp "oracle@${3}:${1}${file}" "${2}" done >> /tmp/GetFile.log.$$ 2>&1grep '^te'用正则表示“行开头是te”,精准匹配以te开头的文件名。
3. 脚本其他小问题修正
原脚本中日志文件名混乱(同时存在/tmp/GetFile.log.$$和/tmp/GetFile.$$),建议统一为同一个日志文件,避免后续awk分析时找不到正确内容。
关键概念区分
- Shell通配符:用于文件名称匹配,由Shell解析。比如
te*匹配以te开头的文件,[te]匹配单个t或e字符,*匹配任意长度的任意字符。 - 正则表达式:用于文本内容匹配,由grep、awk等工具解析。比如
^te表示行开头是te,[te]*表示0个或多个t/e字符,和Shell通配符的规则完全不同。
内容的提问来源于stack exchange,提问作者goced
相关产品推荐
相关产品推荐

