【问题标题】:'Housekeeping' script to create folder and move files用于创建文件夹和移动文件的“管家”脚本
【发布时间】:2018-05-29 00:11:26
【问题描述】:

我一直在尝试研究如何自动化脚本(shell 或其他),该脚本会定期(例如每小时一次)将具有恒定命名约定的文件移动到文件夹(如果还没有,则会自动创建)。 文件是这样的:

相机1_01_20171213221830928.jpg
Camera1_01_20171213223142881.mp4

基本上它会做“家务”。

我是 shell 脚本的新手,如果不存在文件夹(例如名为 20171213 的文件夹),我就是不知道如何创建文件夹,然后将相关文件移入其中?

任何帮助将不胜感激。

【问题讨论】:

  • 你可以使用 logrotate 来做这个。
  • 要创建一个不存在的目录,只需执行mkdir -p 20171213。如果目录已经存在,则为空操作。
  • 要定期运行脚本,请创建一个cron 作业(请参阅man 1 crontab - 您将使用crontab -e)...不要像有人建议的那样在脚本本身内循环和休眠.如果目录尚不存在,您可以使用mkdir -p /path/to/$(date +%Y%m%d) 创建目录(或从文件名中提取 YYYYMMDD)。

标签: linux shell perl unix


【解决方案1】:

您可以使用if [ ! -d "$DIRNAME ]" 查看名为$DIRNAME 的目录是否存在。此外,您可以使用mkdir 创建目录。

或者,您可以只使用mkdir 并忽略目录已存在的任何错误。除此之外,没有负面的副作用。

【讨论】:

    【解决方案2】:

    我无法为您编写脚本,因为您的帖子中没有足够的具体信息,但我认为您需要以下工具:

    • Bash - Bash,用于编写脚本(Here's 另一个有用的参考)
    • Mkdir - 如果目录丢失,则用于创建目录(查看 -p 标志)。
    • Cron - 用于安排脚本每小时执行一次。
    • Sed - 用于从旧文件名创建新文件名

    基本代码如下所示:

    #!/bin/bash
    FILES=/home/joshua/photos/sort-me
    
    for photo in $FILES/*.jpg; do
        if [[ -f photo ]]; then
            new_photo_location= #<figure this part out based on your needs>
            echo "I would move $photo to $new_photo_location"
            #mv $photo $new_photo_location
        fi
    done
    

    我建议仅在您确切看到自己喜欢的内容之前使用该 echo 运行它,然后将该行注释掉并取消 mv 行的注释。

    最后,要每小时运行一次脚本,您的 cron 条目将如下所示。 (输入crontab -e 编辑你的crontab):

     #   Min   Hour  Day    Month   Day-of-Wk  Year  Must use absolute path
         0     *     *      *       *          *     /home/joshua/bin/sort-photos.sh
    

    【讨论】:

      【解决方案3】:
      VDIR=$( date +%F )
      VFILESFX=Camera*
      [ ! -d $VDIR ] && mkdir $VDIR
      while true ; do
         LTMP=$( ls $VFILESFX )
         for i in $LTMP ; do
              fuser ${i}
              [ $? -ne 0 ] && mv $i $VDIR/;
              echo "File ${i} moved to ${VDIR}";
         done
         sleep 3600
      done
      

      只是关于这个脚本的一些解释...... 第一部分将当前日期设置为变量 VDIR,并将前缀 Camera* 设置为 VFILESFX。 如果该目录不存在,条件命令创建一个目录,其值存在于 VDIR 中,然后转到一个 while 命令,每小时交互一次,列出所有前缀设置为 VFILESFX 的文件,并将此文件移动到当前日期的目录

      【讨论】:

      • 您是否可以调整它以作为 cronjob 脚本而不是循环运行?谢谢。
      【解决方案4】:

      我终于使用了一个 perl 脚本,我可以更轻松地从 cron 作业中触发它:

      #!/usr/bin/perl -w
      
      use strict;
      use Data::Dumper;
      use File::Copy;
      
      main();
      
      sub main
      {
          my $dir = "/srv/NAS1/Camera1";
      
          opendir(my $fh, $dir) or die("Could not open '$dir' for reading: $!\n");
      
          my @files = readdir($fh);
      
          closedir($fh);
      
          foreach my $file(@files)
          {
              if(-d $file)
              {
                  next; # skip file if its a folder
              }
      
              if($file =~ /Camera1_01_(\d{8})\d{9}\.(jpg|mp4)/)
              {
                  my $date = $1;
      
                  $date =~ /(\d{4})(\d{2})(\d{2})/;
      
                  my $folder = "$1-$2-$3";
      
                  # if the directory doesn't exist
                  if(!(-e -d "${dir}/${folder}"))
                  {
                      mkdir("${dir}/${folder}");
                  }
      
                  move("${dir}/$file","${dir}/${folder}");
              }
          }
      }
      

      感谢您的贡献。

      【讨论】:

        猜你喜欢
        • 2017-02-01
        • 1970-01-01
        • 2015-11-15
        • 2022-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-01
        相关资源
        最近更新 更多