'管家'用于创建文件夹和移动文件的脚本

时间:2017-12-14 20:05:03

标签: linux shell perl unix

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

Camera1_01_20171213221830928.jpg
Camera1_01_20171213223142881.mp4

基本上它会做家务'。

我是shell脚本的新手,如果没有文件夹(例如20171213文件夹),我就无法解决如何创建文件夹,然后将相关文件移入其中?< / p>

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

  • 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

我建议只使用该回显来运行它,直到您确切看到自己喜欢的内容,然后对该行进行评论并取消对mv行的解除。

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

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

答案 2 :(得分:0)

<body style="text-align:center">
  <h2>Popup</h2>
  <div class="popup" onclick="myFunction()">Click me to toggle the popup!
    <span class="popuptext" id="myPopup">A Simple Popup!</span>
  </div>
</body>

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

答案 3 :(得分:0)

我终于使用了一个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}");
        }
    }
}

感谢您的贡献。