我有一组文件,其名称中包含日期:
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 . -regex ".*.SUB.nc" | cut -d "." -f 4 | while read a; do if [ $a -ge 20151201 ]; then echo $a; fi; done
但:
1)这仅返回文件名的一部分,而我想返回整个文件名。
2)可能有比使用 while read/do 更优雅的方式
提前致谢!
最佳答案
重新排列代码变为:
#!/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 |切 -d '.' -f 3 |使用 rev
是因为
- 如果您提供绝对路径或
- 子目录中有
.
那么它就不会是第 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 正则表达式,例如:
find . -regex ".*.SUB.nc" | grep -E "201512(0[1-9]|[1-9][0-9])|201[6-9][0-9][0-9][0-9]"
关于linux - 查找正则表达式匹配条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50019548/