名前には、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