如何读取指定路径文件,跳过f000并选取f003至f168序列文件?
筛选指定f标识的GRIB2文件
需求明确
需要筛选文件夹中满足以下条件的文件:
- 排除含
f000标识的文件 - 仅保留含
fxxx标识(xxx为3的倍数,范围从003到168,即f003、f006…f168)的文件 - 文件格式示例:
gfs.0p25.2020010100.f000.WE.grib2
解决方案
1. Linux/macOS 命令行(Bash)
方法一:正则匹配(精准高效)
用find命令结合正则表达式直接匹配目标文件:
find /your/folder/path -type f -regextype posix-extended -regex '.*f(00[369]|0[1-9][0369]|1[0-5][0369]|16[258])\.WE\.grib2$'
- 替换
/your/folder/path为实际文件夹路径 - 正则部分精准覆盖003到168之间所有3的倍数的三位数字标识
-type f确保只匹配文件,排除目录
方法二:循环生成匹配项(直观易改)
如果正则不好理解,用循环生成所有目标fxxx标识,再批量匹配:
for i in {3..168..3}; do tag=$(printf "%03d" $i) ls /your/folder/path/*f${tag}*.grib2 done
{3..168..3}生成3到168步长为3的整数序列printf "%03d"将数字转为三位带前导零的格式(如3→003)- 可将
ls替换为cp/mv实现批量复制/移动操作
2. Python 脚本(灵活扩展)
适合需要自定义操作(如批量移动、重命名)的场景:
import os import shutil # 配置参数 source_dir = "/your/folder/path" # 生成所有目标f标识 target_tags = [f"f{num:03d}" for num in range(3, 169, 3)] for filename in os.listdir(source_dir): file_path = os.path.join(source_dir, filename) if not os.path.isfile(file_path): continue # 检查文件名是否包含目标标识 for tag in target_tags: if tag in filename and filename.endswith(".grib2"): print(file_path) # 打印文件路径 # shutil.move(file_path, "/your/destination/path") # 示例:批量移动文件
3. Windows PowerShell
Windows环境下的实现方式:
$sourcePath = "C:\your\folder\path" # 生成目标f标识数组 $targetTags = 3..168 | Where-Object { $_ % 3 -eq 0 } | ForEach-Object { "f{0:D3}" -f $_ } Get-ChildItem -Path $sourcePath -Filter "*.grib2" | ForEach-Object { foreach ($tag in $targetTags) { if ($_.Name -match $tag) { Write-Output $_.FullName # 输出文件路径 # Move-Item -Path $_.FullName -Destination "C:\your\dest\path" # 示例:移动文件 } } }
内容的提问来源于stack exchange,提问作者William Jacondino
相关产品推荐
相关产品推荐

