Erstellen eines Skripts zum Verschieben von Dateien basierend auf Datum oder Dateiname

Erstellen eines Skripts zum Verschieben von Dateien basierend auf Datum oder Dateiname

Ich habe einen FTP-Prozess, der ständig Dateien in ein Verzeichnis legt. Das Erstellungsdatum ist Teil des Dateinamens in einem Format wie diesem:

JJJJ-MM-TT-HH-MM-SS-xxxxxxxxxx.wav

Ich möchte die Dateien basierend auf dem Erstellungsdatum in ein anderes Verzeichnis verschieben. Ich kann entweder den Dateinamen oder den Datumsstempel verwenden, je nachdem, was einfacher ist. Nur Monat und Jahr müssen berücksichtigt werden. Ich habe Verzeichnisse im folgenden Format erstellt:

Jan_2016
Feb_2016

Ich habe Verzeichnisse erstellt und die Dateien manuell verschoben, aber ich möchte dies mit einem Bash-Skript automatisieren, das das Verzeichnis erstellt, wenn es nicht existiert.

Bisher habe ich die Verzeichnisse manuell erstellt und dann diesen Befehl ausgeführt:

mv ./2016-02*.wav Feb_2016/

Antwort1

### capitalization is important. Space separated.
### Null is a month 0 space filler and has to be there for ease of use later.
MONTHS=(Null Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)

cd /your/ftp/dir                  ### pretty obvious I think
for file in *.wav                 ### we are going to loop for .wav files
do                                ### start of your loop
    ### your file format is YYYY-MM-DD-HH-MM-SS-xxxxxxxxxx.wav so
    ### get the year and month out of filename
    year=$(echo ${file} | cut -d"-" -f1)
    month=$(echo ${file} | cut -d"-" -f2)
    ### create the variable for store directory name
    STOREDIR=${year}_${MONTHS[${month}]}

    if [ -d ${STOREDIR} ]         ### if the directory exists
    then
        mv ${file} ${STOREDIR}    ### move the file
    elif                          ### the directory doesn't exist
        mkdir ${STOREDIR}         ### create it
        mv ${file} ${STOREDIR}    ### then move the file
    fi                            ### close if statement
done                              ### close the for loop.

Dies sollte ein guter Ausgangspunkt für eine unerfahrene Person sein. Versuchen Sie, Ihr Skript im Lichte dieser Anweisungen und Befehle zu schreiben. Sie können um Hilfe bitten, wenn Sie nicht weiterkommen

Antwort2

Dieses Skript kann hilfreich sein. (Bitte entfernen Sie das Echo für tatsächliche MV-Dateien):

#!/bin/bash

shopt -s nullglob

month=(Jan Feb Mar May Apr Jun Jul Aug Sep Oct Nov Dec)

for y in 2016; do
    for m in {01..12}; do
        fn="$y-$m"
        dn="${month[10#$m-1]}_$y"
        [[ ! -d $dn ]] && mkdir -p "$dn"
        for file in ./"$fn"*.wav; do
            echo mv "$file" "./$dn/${file#\./}"
        done
    done
done

verwandte Informationen