通过从文件名中提取日期来将文件放入文件夹的脚本

时间:2017-03-21 01:05:36

标签: regex bash

我知道这已被多次询问,我对bash很糟糕,我不理解它的正则表达式格式。想我会请求帮助..

我有一个安全摄像头,它以这种格式将文件写入文件夹:

MDalarm_20170320_084514.mkv

所以它去了 - MDalarm_yearmonthday_hourminutesecond.mkv

我想通过执行以下操作来创建一个运行脚本来清理它的cronjob:

将文件放入文件夹中,每年/每月/每天,然后将文件重命名为时间即:08_26_15.mkv,即使是082615.mkv,如果太麻烦也没问题。

所以在MDalarm_20170320_084514.mkv的例子中

它应该产生

/2017/03/20/08_45_14.mkv

或类似。

文件将在它们到来时放在根文件夹中,脚本将每天在文件夹上运行一次/两次以进行清理。

我在php / js / etc中使用正则表达式是不错的...但是bash one我完全不理解这么做。我真诚地感谢你的帮助。

干杯!

2 个答案:

答案 0 :(得分:1)

使用它来制作所需的文件名

$echo MDalarm_20170320_084514.mkv | sed -E "s/^MDalarm_[[:digit:]]{8}_//"

084514.mkv 这是为了制作所需的文件夹名称

$echo MDalarm_20170320_084514.mkv | sed -E "s/^MDalarm_([[:digit:]]{4})([[:digit:]]{2})([[:digit:]]{2})_.*$/\/\1\/\2\/\3/"

/ 2017/3月20日 在shell命令中使用它们来创建文件夹(如果需要)和复制/重命名/移动文件。

答案 1 :(得分:0)

这就是我最终得到的结果,感谢Yunnosch的正则表达式。

#!/bin/bash
if [[ `ls | grep -c mkv` == 0 ]]
then
        echo "NO MKV FILES"
else
        for f in *.mkv; do
                name=`echo "$f"| sed -E "s/^MDalarm_[[:digit:]]{8}_([[:digit:]]{2})([[:digit:]]{2})([[:digit:]]{2})(.*)$/\1h-\2m-\3s\4/"`
                dir=`echo "$f" | sed -E "s/^MDalarm_([[:digit:]]{4})([[:digit:]]{2})([[:digit:]]{2})_.*$/\1\/\2\/\3/"`
                mkdir -p "$dir"
                mv "$f" "$name"
                mv "$name" "$dir"
        done
fi

有人写了正则表达式后,我发现了格式,不同但相似。