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 實現這一目標的最直接方法是什麼?
如果我理解正確,這是我的建議:
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