首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash -如何根据文件名称中的日期重新组织文件?

Bash -如何根据文件名称中的日期重新组织文件?
EN

Unix & Linux用户
提问于 2021-01-19 00:08:45
回答 3查看 452关注 0票数 3

我正在处理数千个文件,它们的名字包含从2001-01到2020-12-31之间的顺序日期。

此类文件的示例如下:

代码语言:javascript
复制
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,如下所示:

代码语言:javascript
复制
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实现这一目标的最简单的方法是什么?

EN

回答 3

Unix & Linux用户

回答已采纳

发布于 2021-01-19 02:15:52

以下是我的建议,如果我理解正确的话:

代码语言:javascript
复制
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
票数 6
EN

Unix & Linux用户

发布于 2021-01-19 01:18:26

在数年或几个月中循环:

代码语言:javascript
复制
#!/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

代码语言:javascript
复制
#!/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
票数 5
EN

Unix & Linux用户

发布于 2021-01-19 00:44:42

假设日期总是在文件名中的相同位置,那么将其放在脚本中:

代码语言:javascript
复制
#!/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

并使用以下方法调用脚本:

代码语言:javascript
复制
find . -maxdepth 1 -type f -name '*201*' -printf | \
    xargs -r the_script

man bash find xargs mkdir mv

当您想要真正地删除echo时,请删除它。

票数 4
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/629770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档