一个衬垫shell脚本,用于按日期

时间:2015-08-03 00:33:36

标签: linux shell

我有一个文件夹,其中包含许多按日期命名的文件,如下所示:

(有些数字)-date-(somenumbers)。filet ype

其中'日期'列出如下:

20150730225001 2015年7月30日为0 10:50(和1秒)

有没有一种快速的方法来组织这个与Ubuntu终端给出这样的结构:

当前文件夹/年/月/日/小时/(所有符合条件的文件放在此处)

我一直在尝试寻找解决方案,但大多数人都对我感到困惑,因为我对Unix脚本很陌生。

2 个答案:

答案 0 :(得分:2)

因此foo/

中包含这两个文件
42-20150730225001-473826.filet
98-20141115180001-482157.filet

您可以使用此Perl脚本:

#!/usr/bin/perl
for(@ARGV) {
   if (/.*-(\d{4})(\d\d)(\d\d)(\d+)-.*[.]filet/) {
       `mkdir -p $1/$2/$3/ && mv $_ $1/$2/$3/$4.filet`;
   }
}

或者这个oneliner:

ls | xargs perl -e 'for(@ARGV){qx{mkdir -p $1/$2/$3/ && mv $_ $1/$2/$3/$4.filet} if /.*-(\d{4})(\d\d)(\d\d)(\d+)-.*[.]filet/}'

答案 1 :(得分:1)

解决方案假设您在Ubuntu上使用bash作为shell,并且您拥有要在当前工作目录中组织的所有文件。虽然不是单行,但您可以使用字符串索引将日期的各个组成部分分隔为monthday,{{{ 1}}和hour相对容易。然后使用mkdir -p检查/创建所需的相对路径,并使用mv将文件移动到新目标。可以添加一些复合命令以提供一些健全性检查,以确保您拥有14-digit日期/时间字符串等。

有很多方法可以实现分离(例如date -d等),但简单的字符串索引可能是最有效的。如果您有疑问,请告诉我们:

带有延续的半单行

for i in *; do dt=${i%-*}; dt=${dt#*-}; [ ${#dt} -eq 14 ] || continue; \
y=${dt:0:4}; mo=${dt:4:2}; d=${dt:6:2}; h=${dt:8:2}; \
mkdir -p "$y/$mo/$d/$h" && mv "$i" "$y/$mo/$d/$h" || \
printf "error: unable to create: '%s'\n" "$y/$mo/$d/$h"; done

<强>格式化

#!/bin/bash

for i in *; do 

    dt=${i%-*}      ## separate date string from filename
    dt=${dt#*-}

    [ ${#dt} -eq 14 ] || continue  ## validate 14 chars

    y=${dt:0:4}     ## separate into year, mo, day, hour
    mo=${dt:4:2}    #  (you can add checks for ranges)
    d=${dt:6:2}
    h=${dt:8:2}

    ## create new dir & move or throw error
    mkdir -p "$y/$mo/$d/$h" && mv "$i" "$y/$mo/$d/$h" || \
    printf "error: unable to create: '%s'\n" "$y/$mo/$d/$h"

done