Linux下如何查找扩展名包含日期格式数字的文件
解决Linux下查找带日期格式文件的问题
我来帮你搞定这个文件筛选的需求!你要找的是两种格式的文件:一种是结尾带.8位日期.4位数字(比如jvm-app-0.log.20180124.0000),另一种是仅以.8位日期结尾(比如access.log.20180124)。下面我给你正确的命令,顺便解释下你之前尝试的问题出在哪。
正确的查找命令
方式1:用find的正则匹配(推荐,支持递归查找)
find . -type f -regextype posix-extended -regex '.*\.[0-9]{8}([\.[0-9]{4})?$'
逐部分解释:
-type f:只查找文件,避免匹配到目录-regextype posix-extended:启用扩展正则语法,这样我们可以使用{8}、()、?这些更灵活的元字符- 正则表达式部分:
.*:匹配文件路径和文件名的任意前缀(比如./或者./subdir/开头的部分)\.[0-9]{8}:匹配一个点号后面紧跟8位数字(也就是你的日期部分,比如.20180124)([\.[0-9]{4})?$:这是可选的后缀部分,?表示前面的组可以出现0次或1次。也就是说,要么直接以8位日期结尾,要么在8位日期后面再加一个点号和4位数字结尾,完美覆盖你需要的两种文件格式。
方式2:find结合grep(适合熟悉grep的场景)
如果你更习惯用grep,也可以这样写:
find . -type f | grep -E '\.[0-9]{8}([\.[0-9]{4})?$'
grep -E:开启扩展正则模式,和find的posix-extended作用类似- 正则部分和上面一致,专门匹配文件名中的日期格式
方式3:仅查找当前目录(不递归)
如果不需要递归子目录,直接用ls加grep更简单:
ls | grep -E '\.[0-9]{8}([\.[0-9]{4})?$'
你之前尝试的命令问题在哪?
- 第一个命令
find . * | grep "*.[0-9]{8}.*":find . *里的*是多余的,会导致find把当前目录下的文件/目录作为参数,而不是递归查找- grep里的
*是shell通配符,不是正则的“任意字符”,应该用.* {8}需要-E参数才能生效,否则grep会把它当成普通字符处理
- 第二个
find正则命令:- find的
-regex是匹配整个文件路径(比如./jvm-app-0.log.20180124.0000),所以不能用*开头,必须用.*来匹配前面的路径部分 - 正则语法也没写对,缺少了可选后缀的逻辑
- find的
内容的提问来源于stack exchange,提问作者Aqeel Ashiq
相关产品推荐
相关产品推荐

