查找正则表达式匹配条件

时间:2018-04-25 10:09:02

标签: 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

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

我尝试过这样的事情: find . -regex ".*.SUB.nc" | cut -d "." -f 4 | while read a; do if [ $a -ge 20151201 ]; then echo $a; fi; done 但: 1)这只返回文件名的一部分,而我想返回整个文件名。 2)在阅读/执行时可能有比使用更优雅的方式

提前感谢!

2 个答案:

答案 0 :(得分:-1)

重新排列代码:

#!/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 '.' -f 3 | rev是因为

  1. 如果您提供绝对路径或
  2. 子目录中包含.
  3. 然后它不会成为4th字段,但它始终是3rd最后一个字段。

    这将给出输出:

    20151231                                                                 
    20151229                                                                 
    20151230
    

    要显示完整的文件名,请echo $a更改为ls *$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_400.tavg1_2d_slv_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]"                                                 
    

答案 1 :(得分:-1)

这样可以正常使用。

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 '.' -f 3 | rev是因为

  1. 如果您提供绝对路径或
  2. 子目录中包含.
  3. 然后它现在不再是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