Bash

Bash - 如何根據名稱中的日期重新組織文件?

  • January 19, 2021

我正在處理數千個文件,其名稱包含從 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 實現這一目標的最直接方法是什麼?

如果我理解正確,這是我的建議:

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

循環數年和數月:

#!/bin/bash

for year in {2001..2020} ; do
 mkdir $year
 for month in {01..12} ; do
   mkdir $year/$month
   mv gpm_cressman_${year}${month}* $year/$month
 done
done

如果您每年和每月有太多長名稱的文件(您聲稱“數千”),bash可能會達到其限制(“參數列表太長”)。暫時增加 ulimit或使用xargs

#!/bin/bash

for year in {2001..2020} ; do
 mkdir $year
 for month in {01..12} ; do
   mkdir $year/$month
   find -maxdepth 1 -type f -name "gpm_cressman_${year}${month}*" |
     xargs -I '{}' mv '{}' $year/$month
 done
done

引用自:https://unix.stackexchange.com/questions/629770