我正在处理数千个文件,它们的名字包含从2001-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实现这一目标的最简单的方法是什么?
发布于 2021-01-19 02:15:52
以下是我的建议,如果我理解正确的话:
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发布于 2021-01-19 01:18:26
在数年或几个月中循环:
#!/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可能达到它的限制(“参数列表太长”)。暂时增加上限或使用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发布于 2021-01-19 00:44:42
假设日期总是在文件名中的相同位置,那么将其放在脚本中:
#!/bin/bash
#
while $# -gt 0 ; do
file="$1"
shift
year="$( echo "$file" | cut -c 14-17)"
mnth="$( echo "$file" | cut -c 18-19)"
[[ -d $year/$mnth ]] || mkdir -p $year/$mnth
echo mv "$file" $year/$mnth
done并使用以下方法调用脚本:
find . -maxdepth 1 -type f -name '*201*' -printf | \
xargs -r the_script读man bash find xargs mkdir mv。
当您想要真正地删除echo时,请删除它。
https://unix.stackexchange.com/questions/629770
复制相似问题