#!/usr/bin/perl use strict; use warnings; use File::Path qw(make_path); # -------------------------- # CONFIG # -------------------------- my $homedir = "/home/ssm-user/GETD_IIJA/IMS_SNOW"; my $nomads = "ftp://sidads.colorado.edu/DATASETS/NOAA/G02156/24km"; # Edit ranges as needed my $year_start = 2023; my $year_end = 2023; my $doy_start = 180; my $doy_end = 243; # Ensure base dir exists make_path($homedir); for (my $year = $year_start; $year <= $year_end; $year++) { my $out_dir = "$homedir/$year"; make_path($out_dir); for (my $doy = $doy_start; $doy <= $doy_end; $doy++) { my $doy3 = sprintf("%03d", $doy); my (undef, $date2, undef) = GetDate($year, $doy); print "Year=$year DOY=$doy ($date2)\n"; # Build the server directory and the accept pattern my $server_dir = "$nomads/$year/"; my $accept = "ims${year}${doy3}*.gz"; # Use wget to fetch matching files from that directory into $out_dir # -q: quiet, -r: recursive (one dir), -nd: no dirs, -np: no parent # --accept: only files that match, --reject: skip index listings my @cmd = ( 'wget', '-q', '-r', '-nd', '-np', "--accept=$accept", '--reject=index.html*', '-P', $out_dir, $server_dir ); my $rc = system(@cmd); if ($rc != 0) { warn "wget failed (rc=$rc) for $server_dir\n"; } # Check what we got opendir(my $dh, $out_dir) or die "opendir $out_dir: $!"; my @got = grep { /^ims${year}${doy3}.*\.gz$/ } readdir($dh); closedir($dh); if (@got) { print "Downloaded: @got\n"; # If you want to gunzip after download, uncomment: # for my $f (@got) { # system('gunzip', '-f', "$out_dir/$f"); # } } else { print "No IMS file found for ${year}${doy3} under $server_dir\n"; } } } exit 0; # -------------------------- # Date helper (your original logic, cleaned up) # Returns: ($date1, $date2, $date3) # - date1: DDMonYYYY e.g., 02Jan2024 # - date2: YYYYMMDD e.g., 20240102 # - date3: YYYYMM e.g., 202401 # -------------------------- sub GetDate { my ($year, $doy) = @_; my @month = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); my @nday = (31,28,31,30,31,30,31,31,30,31,30,31); # Proper leap-year rule if ( ($year % 4 == 0) && ( ($year % 100 != 0) || ($year % 400 == 0) ) ) { $nday[1] = 29; } my @cum = (0); for my $i (0..$#nday) { $cum[$i+1] = $cum[$i] + $nday[$i]; } my $im = 0; $im++ while $im < 12 && $cum[$im+1] < $doy; my $id = $doy - $cum[$im]; my $dom = sprintf("%02d", $id); my $moy = sprintf("%02d", $im + 1); my $date1 = sprintf("%s%s%d", $dom, $month[$im], $year); my $date2 = sprintf("%d%s%s", $year, $moy, $dom); my $date3 = sprintf("%d%s", $year, $moy); return ($date1, $date2, $date3); }