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
$date
es nicht leer ist. - Sie können
mkdir -p "$target"
davor hinzufügenmv
, 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