Kopiert eine Datei, die ein Datum im Dateinamen enthält, in einen Ordner für dieses Datum.

Kopiert eine Datei, die ein Datum im Dateinamen enthält, in einen Ordner für dieses Datum.

Ich habe nach ähnlichen Fragen gesucht, aber es war schwierig, in meinem Fall eine klare Antwort zu finden.

Ich verwende meine Synology DS1515+ und DSM 6.2.2.

Zuerst habe ich mit dem folgenden Skript einen Tagesordner mit einem Datum erstellt:

mkdir /volume1/video/$(date +%Y-%m-%d\(%a\))

Dieses Skript wird jeden Tag um Mitternacht ausgeführt. Daher werden diese Ordner jede Nacht erstellt.

(Das bedeutet, dass der Zielordner vor dem Kopieren immer bereits vorhanden war.)

Und einige Videodateien werden heruntergeladen. Diese Dateinamen enthalten Datumsangaben.

Zum Beispiel ABCDABCD.200328.avi oder EFGHIJKH.200327.1080p.mp4

Für Dateinamen gelten keine bestimmten Regeln, aber ein Datum vom Typ JJMMTT ist in jedem Dateinamen enthalten.

Ich möchte diese Dateien in Ordner kopieren, die dasselbe Datum enthalten.

(Ordner, der automatisch erstellt wird, wie oben erklärt)


[Speicherort des Verzeichnisses]

Pfad der Dateien, die ich kopieren möchte: /volume1/video/

Beispiel für ein Zielverzeichnis: /volume1/video/daily/2020-04-06(Mon)


Können Sie helfen oder erklären, wie das geht?

Wenn Sie es mir erklären, geben Sie in meinem Fall bitte den Verzeichnispfad an, wie oben.

(weil ich den von Ihnen empfohlenen Code aufgrund mangelnden Verständnisses nicht anwenden kann. Ich bitte um Entschuldigung)

Nochmals vielen Dank. Ich wünsche Ihnen einen schönen Tag.

Antwort1

Versuche dies,

for f in /volume1/video/*; do
  # skip over directories
  [ -f "$f" ] || continue
  # grep the date in YYMMDD format
  date=$(printf '%s' "$f" | grep -Eo '[0-9]{6}')
  # set target path using date to convert YYMMDD to YYYY-MM-DD(%a)
  target="/volume1/video/daily/$(date -d "$date" +%Y-%m-%d\(%a\))/"
  # mv the file
  echo mv "$f" "$target"
done
  • Entfernen Sie das Echo, wenn es funktioniert.
  • Vielleicht wäre es gut, eine Prüfung hinzuzufügen, um festzustellen, ob $datees nicht leer ist.
  • Sie können mkdir -p "$target"davor hinzufügen mv, um Fehler aufgrund fehlender Verzeichnisse zu vermeiden.
  • Hinweis: dieser Code hat einen Jahrtausendfehler ;-)

Antwort2

Habe gerade auch ein Skript erstellt, das ich getestet habe:

#!/bin/bash

SOURCE_FOLDER="video/"
TARGET_FOLDER="video/daily" # Not used as it is under the source folder.

doMove() {
    # Year loop assuming AFTER 2000 up to 2022
    cd "$SOURCE_FOLDER"
    for i in 20{19..20} ; do
        #echo -e "/nWorking on 20$1"
        # Month Loop
        for j in 0{1..9} {10..12} ; do
            # Day Loop
            for k in 0{1..9} {10..31} ; do
                # Find files matching YYMMDD
                file=$(find . -maxdepth 1 -type f -print | grep $i$j$k)
                # For each found file:
                for sf in $file ; do
                    # Find the folder with a different format
                    folder=$(find * -type d -print | grep $i-$j-$k)
                    echo -e "\nFile: $sf"
                    echo -e "Folder: $folder"
                    mv "$sf" "$folder/" # 2> /dev/null
                    echo -e "Moved $sf to $folder"
                done
            done
        done
    done
    cd .. # Change to your needs.
}
doMove

verwandte Informationen