Shell脚本中如何筛选排除以_0.xml结尾的文件
Shell脚本中如何筛选排除以_0.xml结尾的文件
嗨,我来帮你搞定这个问题!你现在需要在Shell脚本里筛选出符合特定命名模式,但排除以_0.xml结尾的文件,这里有几个实用的方法可以选:
方法一:利用Bash扩展通配符(简洁高效)
Bash的扩展通配符能实现更灵活的匹配规则,不过需要先开启extglob选项。你可以在脚本里这样写:# 开启扩展通配符(如果脚本未默认开启) shopt -s extglob # 修改后的匹配规则,自动排除_0.xml结尾的文件 FILES_TO_VALIDATE="$FTP_DEST"/patternorderresponse_[0-9][0-9][0-9][0-9][0-9][0-9][0-9]_UTC*!(_0).xml这里的
!(_0)是扩展通配符的语法,意思是“匹配不是_0的内容”,刚好能把patternorderresponse_xxxxxxx_UTCxxxx_0.xml这类文件排除在外,同时保留其他符合开头模式的XML文件。方法二:用grep反向过滤(兼容性好)
如果你不想依赖Bash的扩展特性,可以先获取所有符合原模式的文件,再用grep -v反向排除目标文件:# 先获取原模式匹配的所有文件,再过滤掉_0.xml结尾的 FILES_TO_VALIDATE=$(ls "$FTP_DEST"/patternorderresponse_[0-9][0-9][0-9][0-9][0-9][0-9][0-9]_UTC*.xml | grep -v "_0\.xml$")注意这里的
_0\.xml$里,点号需要转义(\.),$表示匹配行尾,确保只排除刚好以_0.xml结尾的文件。不过要注意,如果文件名包含空格或特殊字符,ls的输出可能会出问题,这种情况下更推荐用下面的方法。方法三:用find命令(安全可靠,适配特殊文件名)
find命令处理带空格、特殊字符的文件名更稳妥,还能避免一些通配符的坑:# 查找指定目录下符合模式的文件,排除_0.xml结尾的 FILES_TO_VALIDATE=$(find "$FTP_DEST" -maxdepth 1 -type f -name "patternorderresponse_[0-9][0-9][0-9][0-9][0-9][0-9][0-9]_UTC*.xml" ! -name "*_0.xml")参数说明:
-maxdepth 1:只查找$FTP_DEST目录本身,不递归子目录-type f:只匹配普通文件(排除目录等)! -name "*_0.xml":明确排除以_0.xml结尾的文件
要是你用的是Bash环境,方法一最简洁;如果需要跨Shell兼容,或者处理复杂文件名,方法三会更靠谱。
备注:内容来源于stack exchange,提问作者AnaGutiFontan
相关产品推荐
相关产品推荐

