【问题标题】:Script to place files in folder by extracting date from filename通过从文件名中提取日期来将文件放置在文件夹中的脚本
【发布时间】:2017-03-21 10:05:29
【问题描述】:

我知道这个问题已经被问过很多次了,我对 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 来完成这项工作。衷心感谢您的帮助。

干杯!

【问题讨论】:

    标签: regex bash


    【解决方案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/03/20 在 shell 命令中使用它们来创建文件夹(如果需要)和复制/重命名/移动文件。

    【讨论】:

      【解决方案2】:

      这就是我最终得到的结果并且它有效,感谢 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
      

      一旦有人写出正则表达式,我就知道格式,不同但相似。

      【讨论】:

        猜你喜欢
        • 2021-07-17
        • 2011-02-24
        • 1970-01-01
        • 1970-01-01
        • 2018-05-28
        • 1970-01-01
        • 1970-01-01
        • 2015-01-08
        • 1970-01-01
        相关资源
        最近更新 更多