我正在尝试编写一个可以复制一堆文件的 shell 脚本,但是在设置循环来读取这些文件时遇到了困难:
aws s3 cp s3://noaa-bdp-pds/gdas.YYYYMMDD/00/atmos/hdas.t00z.sfcf000.nc s3://s3internal/raw/HDAS/hdas.YYYYMMDD_00Z.nc
这里 YYYY、MM、DD 是我需要循环的数字。
我需要循环遍历所有年份、所有月份和日期来保存所有文件。请告诉我这是否可以做到?
谢谢
答案1
您可以使用aws s3 sync
通配符来实现此目的并--dryrun
产生输出:
$ aws s3 sync s3://noaa-bdp-pds . \
--exclude "*" --include "gdas.*/00/atmos/hdas.t00z.sfcf000.nc"
(dryrun) download s3://noaa-bdp-pds/gdas.20210001/00/atmos/hdas.t00z.sfcf000.nc to noaa-bdp-pds /gdas.20210001/00/atmos/hdas.t00z.sfcf000.nc
...
...
请记住使用空目录,否则可能会干扰输出。
现在,你可以使用它来构造一个循环:
#!/bin/bash
for line in $( \
aws s3 sync s3://noaa-bdp-pds . \
--exclude "*" --include "gdas.*/00/atmos/hdas.t00z.sfcf000.nc" | awk '/s3:\/\//{print $3}' --dryrun \
); do
[[ $line =~ .*/gdas.(.*)/00/.* ]] && \
echo aws s3 cp ${BASH_REMATCH[0]} s3://s3internal/raw/HDAS/hdas.${BASH_REMATCH[1]}_00Z.nc
done
当您对结果满意时,删除echo
复制的文件。