2017-12-14 3 views
1

Ich habe versucht zu untersuchen, wie ein Skript (Shell oder andere) zu automatisieren, das regelmäßig (einmal pro Stunde) Dateien mit einer konstanten Namenskonvention in einen Ordner (der wird automatisch erstellt, wenn nicht schon da). Die Dateien sind wie folgt aus:'Housekeeping' Skript zum Erstellen von Ordnern und Verschieben von Dateien

Camera1_01_20171213221830928.jpg
Camera1_01_20171213223142881.mp4

Grundsätzlich wird es tun 'Housekeeping' werden.

Ich bin neu in Shell-Skripten, und ich kann einfach nicht herausfinden, wie man einen Ordner erstellt, wenn es nicht da ist (Ordner mit dem Namen 20171213 zum Beispiel), dann die relevanten Dateien hineinziehen?

Jede Hilfe würde sehr geschätzt werden.

+0

Sie können möglicherweise logrotate dafür verwenden. – ti7

+0

Um ein Verzeichnis zu erstellen, wenn es nicht existiert, einfach 'mkdir -p 20171213'. Wenn das Verzeichnis bereits existiert, ist es ein No-Op. –

+0

Um das Skript in regelmäßigen Abständen auszuführen, erstellen Sie einen 'cron'-Job (siehe' man 1 crontab' - Sie verwenden 'crontab -e') ... nicht innerhalb des Skripts selbst loopen und schlafen, wie jemand vorgeschlagen hat. Sie können ein 'mkdir -p/Pfad/zu/$ (Datum +% Y% m% d)' erstellen, um das Verzeichnis zu erstellen, wenn es nicht bereits existiert (oder extrahieren Sie das YYYYMMDD aus dem Dateinamen). –

Antwort

0

ich ging schließlich mit einem perl-Skript, das ich leichter von einem cron-Job auslösen könnte:

#!/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}"); 
     } 
    } 
} 

Dank für die Beiträge.

0

Sie können if [ ! -d "$DIRNAME ]" verwenden, um zu sehen, ob ein Verzeichnis namens $DIRNAME existiert. Weiter können Sie mkdir verwenden, um Verzeichnisse zu erstellen.

Alternativ können Sie einfach mkdir verwenden und jeden Fehler ignorieren, dass ein Verzeichnis bereits existiert. Ansonsten gibt es keine negativen Nebenwirkungen.

0

ich nicht in der Lage sein, für das Skript zu schreiben, weil Sie nicht genug spezifische Informationen in Ihrem Beitrag haben Sie, aber hier sind die Werkzeuge, die ich denke, Sie brauchen:

  • Bash - Bash , zum Schreiben Ihres Skripts (Here's eine andere nützliche Referenz)
  • Mkdir - Zum Erstellen eines Verzeichnisses, wenn es fehlt (siehe das Flag -p).
  • Cron - Für die Planung der stündlichen Ausführung Ihres Skripts.
  • Sed - Für

Der Basiscode die neuen Dateinamen von den alten zu schaffen wird in etwa so aussehen:

#!/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 

Ich empfehle es mit diesem Echo läuft nur, bis Sie genau sehen, was Sie mögen, dann kommentieren Sie diese Linie und geben Sie die mv Linie frei.

Schließlich, um das Skript jede Stunde zu jeder Stunde zu starten, wird Ihr Cron-Eintrag in etwa so aussehen. (Typ crontab -e crontab zu bearbeiten):

# Min Hour Day Month Day-of-Wk Year Must use absolute path 
    0  *  *  *  *   *  /home/joshua/bin/sort-photos.sh 
0
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 

nur eine Erklärung über dieses Skript ... Der erste Teil das aktuelle Datum in eine Variable VDIR gesetzt und das Präfix Kamera * in VFILESFX. Der Bedingungsbefehl erstellt ein Verzeichnis mit dem in VDIR vorhandenen Wert, wenn dieses Verzeichnis nicht existiert, danach gehen Sie zu einem While-Befehl, der stündlich alle Dateien mit dem in VFILESFX eingestellten Präfix auflistet und diese Dateien in das Verzeichnis mit dem aktuellen Verzeichnis verschiebt Datum

+0

Können Sie zwicken, es als Cronjob-Skript statt als Schleife auszuführen? Vielen Dank. – wrighty

Verwandte Themen