Bash - 名前の日付に基づいてファイルを再構成する方法は?

Bash - 名前の日付に基づいてファイルを再構成する方法は?

名前には、2001-01-01から2020-12-31までの連続日を含む数千のファイルを処理しています。

これらのファイルの例は次のとおりです。

gpm_original_20010101.nc
gpm_cressman_20010101_cor_method-add_fac-0.5_pass-1_radius-500km.nc
gpm_cressman_20010101_cor_method-add_fac-0.5_pass-2_radius-250km.nc
gpm_cressman_20010101_cor_method-add_fac-0.5_pass-3_radius-150km.nc
gpm_cressman_20010101_cor_method-add_fac-0.5_pass-4_radius-75km.nc
gpm_cressman_20010101_cor_method-add_fac-0.5_pass-5_radius-30km.nc
.
.
.
gpm_original_20010131.nc
gpm_cressman_20010131_cor_method-add_fac-0.5_pass-1_radius-500km.nc
gpm_cressman_20010131_cor_method-add_fac-0.5_pass-2_radius-250km.nc
gpm_cressman_20010131_cor_method-add_fac-0.5_pass-3_radius-150km.nc
gpm_cressman_20010131_cor_method-add_fac-0.5_pass-4_radius-75km.nc
gpm_cressman_20010131_cor_method-add_fac-0.5_pass-5_radius-30km.nc

など2020-12-31。私がしなければならないのは、これらのファイルを年と月に基づいて新しいフォルダに再構築することだけです。

ディレクトリツリーは、次のようにyearサブディレクトリのロジックに従う必要があります。months

2001
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12

2002
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12

など。そして、ファイル名に対応する日付に基づいてファイルをこれらのディレクトリに移動する必要があります。たとえば、200101xx名前に含まれるすべてのファイルをこの2001/01フォルダに移動する必要があります。

bashを使用してこれを達成する最も簡単な方法は何ですか?

ベストアンサー1

私が正しく理解したなら、これは私の提案です。

for i in *.nc; do 
  [[ "$i" =~ _([0-9]{8})[_.] ]] && d="${BASH_REMATCH[1]}"
  mkdir -p "${d:0:4}/${d:4:2}"
  mv "$i" "${d:0:4}/${d:4:2}"
done

おすすめ記事