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方法,您必须硬编码日期,而我希望将其作为参数包含(我没有提到)。第一种方法很好,谢谢!