Linux 查找正则表达式匹配条件

Linux 查找正则表达式匹配条件,linux,bash,Linux,Bash,我有一组文件,文件名中包含日期: MERRA2_400.tavg1_2d_slv_Nx.20151229.SUB.nc MERRA2_400.tavg1_2d_slv_Nx.20151230.SUB.nc MERRA2_400.tavg1_2d_slv_Nx.20151231.SUB.nc 我想选择与此日期的条件匹配的文件。在本例中:日期>20151230 我试过这样的方法: find-正则表达式“*.SUB.nc”| cut-d.”-f 4 |同时读取a;如果[$a-通用电气20151201]

我有一组文件,文件名中包含日期:
MERRA2_400.tavg1_2d_slv_Nx.20151229.SUB.nc
MERRA2_400.tavg1_2d_slv_Nx.20151230.SUB.nc
MERRA2_400.tavg1_2d_slv_Nx.20151231.SUB.nc

我想选择与此日期的条件匹配的文件。在本例中:日期>20151230

我试过这样的方法:
find-正则表达式“*.SUB.nc”| cut-d.”-f 4 |同时读取a;如果[$a-通用电气20151201];然后回声$a;fi;完成
但是: 1) 这只是返回文件名的一部分,而我想返回整个文件名。 2) 可能有一种比边读边做更优雅的方法


提前谢谢

重新排列代码将变成:

#!/usr/bin/env bash

find . -regex ".*.SUB.nc" \                                              
    | rev | cut -d '.' -f 3 | rev \                                                 
    | while read a; do                                                   
          if [ $a -ge 20151201 ]; then                                   
              echo $a                                                  
          fi                                                            
      done 
rev | cut-d.”-f3 | rev
的使用是因为

  • 如果给出绝对路径或
  • 子目录中有
  • 然后它将不再是
    4th
    字段,而是始终是
    3rd
    最后一个字段

    这将提供以下输出:

    20151231                                                                 
    20151229                                                                 
    20151230
    
    要显示完整的文件名,请使用
    ls*$a*
    更改
    echo$a
    。输出:

    MERRA2_400.tavg1_2d_slv_Nx.20151231.SUB.nc                               
    MERRA2_400.tavg1_2d_slv_Nx.20151229.SUB.nc                               
    MERRA2_400.tavg1_2d_slv_Nx.20151230.SUB.nc                               
    
    我用日期小于
    20151201
    的文件名测试了这个脚本。例如
    MERRA2\u 400.tavg1\u 2d\u slv\u Nx.20151200.SUB.nc
    。结果是一致的

    也许完成任务的更有效方法是使用grep regex,如:

    find . -regex ".*.SUB.nc" | grep -E "201512(0[1-9]|[1-9][0-9])|201[6-9][0-9][0-9][0-9]"                                                 
    

    这就行了

    find . -regex ".*.SUB.nc" | rev | cut -d '.' -f 3 | rev | while read a; do if [ $a -ge 20151201 ]; then echo `ls -R | grep $a` ;fi ;done
    
    rev | cut-d.”-f3 | rev
    的使用是因为

  • 如果给出绝对路径或
  • 子目录中有
  • 现在它将不再是
    4th
    字段,而是始终是
    3rd
    最后一个字段

    ls-R | grep$a
    ,这样您就可以递归地找到文件名

    假设为文件,文件结构为:

    [root@localhost temp]# ls -lrt -R
    .:
    total 8
    -rw-r--r--. 1 root root    0 Apr 25 16:15 MERRA2_400.tavg1_2d_slv_Nx.20151231.SUB.nc
    -rw-r--r--. 1 root root    0 Apr 25 16:15 MERRA2_400.tavg1_2d_slv_Nx.20151230.SUB.nc
    -rw-r--r--. 1 root root    0 Apr 25 16:15 MERRA2_400.tavg1_2d_slv_Nx.20151229.SUB.nc
    drwxr-xr-x. 2 root root 4096 Apr 25 16:32 temp.3
    drwxr-xr-x. 3 root root 4096 Apr 25 17:13 temp2
    
    ./temp.3:
    total 0
    
    ./temp2:
    total 4
    -rw-r--r--. 1 root root    0 Apr 25 16:27 MERRA2_400.tavg1_2d_slv_Nx.20151111.SUB.nc
    -rw-r--r--. 1 root root    0 Apr 25 16:27 MERRA2_400.tavg1_2d_slv_Nx.20151222.SUB.nc
    drwxr-xr-x. 2 root root 4096 Apr 25 17:13 temp21
    
    ./temp2/temp21:
    total 0
    -rw-r--r--. 1 root root 0 Apr 25 17:13 MERRA2_400.tavg1_2d_slv_Nx.20151333.SUB.nc
    
    运行上面的命令可以得到:

    MERRA2_400.tavg1_2d_slv_Nx.20151229.SUB.nc
    MERRA2_400.tavg1_2d_slv_Nx.20151231.SUB.nc
    MERRA2_400.tavg1_2d_slv_Nx.20151230.SUB.nc
    MERRA2_400.tavg1_2d_slv_Nx.20151333.SUB.nc
    MERRA2_400.tavg1_2d_slv_Nx.20151222.SUB.nc
    

    将echo$a替换为ls$a。您的命令将起作用。如果子目录中存在某些文件,则它将不起作用。
    -r
    用于
    反向
    而不是递归地
    感谢您的洞察力。使用grep regex方法,您必须硬编码日期,而我希望将其作为参数包含(我没有提到)。第一种方法很好,谢谢!