Neue Filme automatisch ab Datum auf Ext. USB schieben (Paket oder Shell Skript?!?)

Status
Für weitere Antworten geschlossen.

seger85

Benutzer
Mitglied seit
21. Feb 2018
Beiträge
127
Punkte für Reaktionen
0
Punkte
16
Ja, das wäre sehr sinnvoll, machen das wohl auch so wie du es geschrieben hast. Nur erstmal noch einige Anpassungen am Log. Danach kann man/ich (ihr) mir ja durch die Schleifen helfen damit ich es verstehe und lerne.

Hinsichtlich des Punktes „Kopierte Datenmenge in MB/GB“ habe ich mich jetzt schlau gemacht und CP unterstützt es in meinem Fall nicht.
Hatte da eine Variante getestet, aber die geht nicht. Um den Punkt nicht ganz zu vergessen könnte man den Punkt auch mit der Info „Freier Speicherplatz“ auf der USB Platte umgehen. Gibt es da vielleicht eine Möglichkeit die euch einfällt, hab schon einiges probiert aber nichts ging.

Viele Grüße
Seger
 

seger85

Benutzer
Mitglied seit
21. Feb 2018
Beiträge
127
Punkte für Reaktionen
0
Punkte
16
Moin zusammen,

ich lerne ja gerade ein wenig und bin gerade dabei dem Log noch 2 neue Information hinzuzufügen. Folgendes habe ich hinzugefügt:

Code:
[B]speicherplatz() {
  cd "/volumeUSB1/usbshare" && du -sh
}

freierspeicherplatz() {
  cd "/volumeUSB1/usbshare" && df -h
}[/B]

after=$(date +%m)

echo -e "\nScript-Laufzeit:" $((after - $before)) "Minuten" >> $LOGPFAD
[B]echo -e "\nBelegter-Speicherplatz:" $(speicherplatz)>> $LOGPFAD
echo -e "\nFestplatten-Größe:" $(freierspeicherplatz)>> $LOGPFAD[/B]

Belegter-Speicherplatz funktioniert schon ganz okay, er zeigt mir in meinem Fall "20G ." was soviel bedeutet, dass 20 Gigabyte belegt sind.

1 Frage: Gibt es eine andere Variante oder hab ich das schon ganz gut gelöst?
Gibt es vielleicht eine Variante wo es immer ausgeschrieben dargestellt wird z.B. "20 Gigabyte" oder ohne den Ordner "."?

Festplatten-Größe wird natürlich nicht sauber angezeigt, der gibt mir alle Informationen des Befehls df -h wieder.

2 Frage: Gibt es eine Möglichkeit die Info sauber abzurufen? Z.B. 2000 Gigabyte (ich bleibe mal in GB um die Infos besser miteinander zu vergleichen).

3 Frage: Wie kann ich die beiden Echo-Befehle miteinander verbinden, hab es schon mit "&&" versucht. Optimaler weise sollen die Echo Verbindungen nicht untereinander sondern durch ein Tab in der selben Zeile stehen.
Mit \n ging ja eine neue Zeile, aber wie bleibe ich in der selben Zeile und mache ein TAB?

Später nach den Schleifen kann ich ja die absoluten Pfade durch die Variable (z.B. ZIELPFAD="/volumeUSB1/usbshare/") ersetzen.

Ich hoffe ihr merkt das ich ein wenig Fortschritte machen :)

...Achso, wenn ihr das anders lösen würdet, immer her damit.

Danke und viele Grüße
Seger
 

PsychoHH

Benutzer
Mitglied seit
03. Jul 2013
Beiträge
2.967
Punkte für Reaktionen
4
Punkte
78
1. Klar. z.B. mit sed per pipe
du -sh | sed 's/G.*/ GB/'

3. Tab geht mit \t
echo -e "Hallo\tUser"

Einfach dann mit \t pro Zeile ein Echo nutzen.

Du kannst doch auch vor, in und nach der Schleife die absoluten Pfade nutzen, was spricht dagegen?
 

seger85

Benutzer
Mitglied seit
21. Feb 2018
Beiträge
127
Punkte für Reaktionen
0
Punkte
16
1. Klar. z.B. mit sed per pipe
du -sh | sed 's/G.*/ GB/'

3. Tab geht mit \t
echo -e "Hallo\tUser"

Einfach dann mit \t pro Zeile ein Echo nutzen.

Du kannst doch auch vor, in und nach der Schleife die absoluten Pfade nutzen, was spricht dagegen?

Sed Befehl funktioniert super :), danke! Wenn ich den Sed Befehl um "TB ." & "MB ." erweitern möchte muss er dann so aussehen:
Code:
sed 's/G.*/ Gigabyte/T.*/ Terabyte/M.*/ Megabyte/'

3. Das mit dem \t hatte ich schon gelesen, ich hab das falsch formuliert. Ich würde die Echos in einer Zeile mit einem TAB getrennt haben wollen:
Code:
 echo -e "\nScript-Laufzeit:" $((after - $before)) "Minuten" >> $LOGPFAD | echo -e "\tBelegter-Speicherplatz:" $(speicherplatz)>> $LOGPFAD

Hinsichtlich deiner Frage, es spricht wohl überhaupt nichts dagegen, das sollte von meiner Seite eigentlich nur soviel heißen, dass ich das ganze Thema Schleifen erst später besprechen will, damit ich das auch alles verstehe. Alleine der neue Befehl Sed bringt mich ins schleudern :).

Zum Punkt "Größe des Laufwerks" hast du wohl keine Idee oder?

Bitte nicht verzweifeln, bin absoluter Anfänger und brauche fast immer eine Erklärung.

Danke für die weitere Hilfe!

Viele Grüße
Seger

Edit: den Sed Code habe ich jetzt so angepasst:
Code:
speicherplatz() {
  cd "/volumeUSB1/usbshare" && du -sh| sed 's/G.*/ Gigabyte/'; sed 's/T.*/ Terabyte/'; sed 's/M.*/ Megabyte/'

}
Ist das so richtig?
 
Zuletzt bearbeitet:

Fusion

Benutzer
Sehr erfahren
Mitglied seit
06. Apr 2013
Beiträge
14.137
Punkte für Reaktionen
898
Punkte
424
Kannst mehrere Strings auf einmal ersetzen lassen.
Code:
sed 's/G.*/ Gigabyte/g; s/T.*/ Terabyte/g; s/M.*/Megabyte/g'

Echo, mal probieren. Bin nicht 100% sicher gerade.
Code:
echo -e ""\nScript-Laufzeit:" $((after - $before)) "Minuten" \t "Belegter-Speicherplatz:" $(speicherplatz)" >> $LOGPFAD

df -h läßt sich auch auf einen bestimmten Ort eingrenzen, z.B.
Code:
df -h /volumeUSB1
Das wäre dann für den belegten Platz
Code:
df -h /volumeUSB1/usbshare | awk '/^\/volumeUSB1/ { print $3 }'
für den freien Platz
Code:
df -h /volumeUSB1/usbshare | awk '/^\/volumeUSB1/ { print $4 }'

Mit awk nimmt man den Output von df, sucht den String und gibt dann das x-te Argument $Nummer aus (Leerzeichen oder Tab-trennung denke ich bei der Erkennung/Trennung der Argumente).

Für eine andere Darstellung läßt sich das natürlich auch wieder an sed "pipen" mit |
Code:
df -h /volumeUSB1/usbshare | awk '/^\/volumeUSB1/ { print $4 }' | sed 's/G.*/ Gigabyte/g; s/T.*/ Terabyte/g; s/M.*/Megabyte/g'
 

seger85

Benutzer
Mitglied seit
21. Feb 2018
Beiträge
127
Punkte für Reaktionen
0
Punkte
16
@Fusion, ich werde dich jetzt nicht zitieren (wegen der Übersichtlichkeit), aber du bist einfach genial und ich verstehe es tatsächlich :), DANKE!!!

Ich poste nochmal den gesamten Code, da ich durch dich einige Dinge geändert habe.

Ich habe beim Echo leichte Anpassungen gemacht und bin nun mit den Infos total happy :).
-> Natürlich wäre die Info der Ø Übertragungsrate des Kopiervorgangs (in MB/s) noch super gewesen, aber das brauche ich eigentlich nicht
(habe ja ne USB 3.0 Platte angeschlossen und zur Not schaue ich einfach mal in DSM).

Darüber hinaus habe ich noch weitere Informationen aus
Code:
 df -h
hinzugefügt und bei deinem Tipp
Code:
 df -h /volumeUSB1/usbshare[COLOR="#FF0000"]/[/COLOR]
hinzugefügt :).
So funktionierte es dann schon fast so wie ich es mir vorgestellt habe. Dann habe ich von ganz alleine die Funktion
Code:
 | tail --lines +2
hinzugefügt, um nach dem "Kopf" erst zu suchen, bin total stolz, danke nochmal!

Jetzt sind eigentlich nur noch sehr wenige Dinge übrig um das absolut perfekte Skript zu haben. Also eigentlich reicht es mir schon so, denn für mich funktioniert es ja zu 100% :). Aber wenn du noch Lust hast können wir gern weitermachen und ein wenig lernen bzw. lehren spielen.

Folgende Punkte habe ich nach Prio sortiert:

LOG
1. Log anders herum sortieren (sprich, der neuste Eintrag immer oben)
1b. Wegen der Übersichtlichkeit erst ab "->" das Log darstellen
1c. Ich habe am Log rum gespielt und bin von Sekunden auf Minuten gegangen, weißt du wie ich auch Minuten und Sekunden anzeigen kann? %m%s funktionierte nicht.
1d. Zwischen den Pfaden noch immer ein Leerzeile hinzufügen, setze ich das einfach so:
Code:
cd "[COLOR="#FF0000"]\n[/COLOR]$QUELLE2"
, oder muss ich das \n wo anders setzen?

Neue Funktionen
2. Schleifen, Variable setzen für Quellen oder Arrays (was du glaubst was das Beste ist)

3. Quellpfad/"Ordnername" auf Zielpfad erstellen, wenn nicht vorhanden. Sonst nichts machen (ist ja eine Form von Schleife) - Dadurch und durch Punkt 2 wird das Skript ziemlich universell (vielleicht auch für andere User)

Optional
4. Optional weil blöder Punkt: Ø Übertragungsrate des Kopiervorgangs (in MB/s)

Anbei der jetzige Code:
Code:
#!/bin/bash
AUSWAHLDATUM="2018-02-22"

QUELLE1="/volume1/DiskStation/Emby Testumgebung/- Filme x265 (Neu Test)"
QUELLE2="/volume1/DiskStation/Emby Testumgebung/- Filme"
QUELLE3="/volume1/DiskStation/Emby Testumgebung/- Kinderfilme"
QUELLE4="/volume1/DiskStation/Emby Testumgebung/- Serien"

ZIEL1="/volumeUSB1/usbshare/- Filme x265 (Neu Test)"
ZIEL2="/volumeUSB1/usbshare/- Filme"
ZIEL3="/volumeUSB1/usbshare/- Kinderfilme"
ZIEL4="/volumeUSB1/usbshare/- Serien"

LOGPFAD="/volumeUSB1/usbshare/Log.txt"
LOGFEHLERPFAD="/volumeUSB1/usbshare/Fehler.txt"

before=$(date +%m)

timestamp() {
  date +"%d.%m.%Y - %T"
}

echo -e "\nStartzeitpunkt: $(timestamp)\n" >> $LOGPFAD


cd "$QUELLE1" && find -not \( -path "*@eaDir*" -prune \) -type f -newermt "$AUSWAHLDATUM" -exec cp -uv --parents "{}" "$ZIEL1" 2>> "$LOGFEHLERPFAD" 1>> "$LOGPFAD" \;
cd "$QUELLE2" && find -not \( -path "*@eaDir*" -prune \) -type f -newermt "$AUSWAHLDATUM" -exec cp -uv --parents "{}" "$ZIEL2" 2>> "$LOGFEHLERPFAD" 1>> "$LOGPFAD" \;
cd "$QUELLE3" && find -not \( -path "*@eaDir*" -prune \) -type f -newermt "$AUSWAHLDATUM" -exec cp -uv --parents "{}" "$ZIEL3" 2>> "$LOGFEHLERPFAD" 1>> "$LOGPFAD" \;
cd "$QUELLE4" && find -not \( -path "*@eaDir*" -prune \) -type f -newermt "$AUSWAHLDATUM" -exec cp -uv --parents "{}" "$ZIEL4" 2>> "$LOGFEHLERPFAD" 1>> "$LOGPFAD" \;

gesamtspeicherplatzderfestplatte() {
  df -h /volumeUSB1/usbshare | awk '/^\/volumeUSB1/usbshare { print $2 }' | tail --lines +2 | sed 's/G.*/ Gigabyte/g; s/T.*/ Terabyte/g; s/M.*/Megabyte/g'

}

belegterspeicherplatz() {
  df -h /volumeUSB1/usbshare | awk '/^\/volumeUSB1/usbshare { print $3 }' | tail --lines +2 | sed 's/G.*/ Gigabyte/g; s/T.*/ Terabyte/g; s/M.*/Megabyte/g'

}

freierspeicherplatz() {
  df -h /volumeUSB1/usbshare | awk '/^\/volumeUSB1/usbshare { print $4 }' | tail --lines +2 | sed 's/G.*/ Gigabyte/g; s/T.*/ Terabyte/g; s/M.*/Megabyte/g'
}

belegterspeicherplatzinprozent() {
  df -h /volumeUSB1/usbshare | awk '/^\/volumeUSB1/usbshare { print $5 }' | tail --lines +2
}

after=$(date +%m)

echo -e "\nScript-Laufzeit:" $((after - $before)) "Minuten" >> $LOGPFAD
echo -e "\nBelegter-Speicherplatz:" $(belegterspeicherplatz)" \t "Belegter-Speicherplatz:" $(belegterspeicherplatzinprozent)" >> $LOGPFAD
echo -e """\n"Freier Speicherplatz:" $(freierspeicherplatz) \t\t "Festplatten-Größe:" $(gesamtspeicherplatzderfestplatte)" >> $LOGPFAD

LOG
Code:
Startzeitpunkt: 13.03.2018 - 23:04:45

./Jumper (2008) -> /volumeUSB1/usbshare/- Filme x265 (Neu Test)/./Jumper (2008)
'./Jumper (2008)/Jumper (2008).nfo' -> '/volumeUSB1/usbshare/- Filme x265 (Neu Test)/./Jumper (2008)/Jumper (2008).nfo'
'./Jumper (2008)/Jumper (2008).mkv' -> '/volumeUSB1/usbshare/- Filme x265 (Neu Test)/./Jumper (2008)/Jumper (2008).mkv'
'./Jumper (2008)/clearart.png' -> '/volumeUSB1/usbshare/- Filme x265 (Neu Test)/./Jumper (2008)/clearart.png'
'./Jumper (2008)/banner.jpg' -> '/volumeUSB1/usbshare/- Filme x265 (Neu Test)/./Jumper (2008)/banner.jpg'
'./Jumper (2008)/logo.png' -> '/volumeUSB1/usbshare/- Filme x265 (Neu Test)/./Jumper (2008)/logo.png'
./Der Polarexpress (2004) -> /volumeUSB1/usbshare/- Kinderfilme/./Der Polarexpress (2004)
'./Der Polarexpress (2004)/Der Polarexpress (2004).nfo' -> '/volumeUSB1/usbshare/- Kinderfilme/./Der Polarexpress (2004)/Der Polarexpress (2004).nfo'
'./Der Polarexpress (2004)/poster.jpg' -> '/volumeUSB1/usbshare/- Kinderfilme/./Der Polarexpress (2004)/poster.jpg'
'./Der Polarexpress (2004)/disc.png' -> '/volumeUSB1/usbshare/- Kinderfilme/./Der Polarexpress (2004)/disc.png'
'./Der Polarexpress (2004)/clearart.png' -> '/volumeUSB1/usbshare/- Kinderfilme/./Der Polarexpress (2004)/clearart.png'
'./Der Polarexpress (2004)/banner.jpg' -> '/volumeUSB1/usbshare/- Kinderfilme/./Der Polarexpress (2004)/banner.jpg'
'./Der Polarexpress (2004)/logo.png' -> '/volumeUSB1/usbshare/- Kinderfilme/./Der Polarexpress (2004)/logo.png'
'./Der Polarexpress (2004)/fanart.jpg' -> '/volumeUSB1/usbshare/- Kinderfilme/./Der Polarexpress (2004)/fanart.jpg'
'./Der Polarexpress (2004)/landscape.jpg' -> '/volumeUSB1/usbshare/- Kinderfilme/./Der Polarexpress (2004)/landscape.jpg'

Script-Laufzeit: 0 Minuten

Belegter-Speicherplatz: 20 Gigabyte 	 Belegter-Speicherplatz: 2%

Freier Speicherplatz: 1.9 Terabyte 		 Festplatten-Größe: 1.9 Terabyte

Herzlichen Dank nochmal an dieser Stelle!
Ich hab es dir noch nicht verraten, aber wenn du mir deine Adresse per PN zukommen lässt, dann bekommst du was ganz tolles von mir :)

Viele Grüße
Seger
 

Fusion

Benutzer
Sehr erfahren
Mitglied seit
06. Apr 2013
Beiträge
14.137
Punkte für Reaktionen
898
Punkte
424
Zu 1) das einfachste was mir grad einfällt ist die Datei am Ende "umzudrehen"
Code:
tac /pfad/datei > /pfad/InversDatei
Also einfach Zeile für Zeile umgekehrt in eine neue Datei zu schreiben.
Alles andere mit sed, awk, grep etc kommt an Ende auf das gleiche raus.

Zu 1b) im Nachgang. (direkt bei der Logerstellung müsste ich nochmal überlegen)
Code:
sed 's/^.*-> //' /Pfad/Logfile > /Pfad/NeuesLog

Ergänzung: Kann man auch in Kombi mit 1) machen
Code:
tac /Pfad/Logfile | sed 's/^.*-> //' > /Pfad/InvertiertesUndBereinigtesLogfile

Zu 1c) Hängt noch von der gewünschten Formatierung ab, bsp für Minuten:Sekunden
Code:
after=$(date +%m:%S)

Zu 1d) Schnellschuß, Anhängsel/Ergänzung an jede Zeile hinten
Code:
cd ...........\; echo 1>> "$LOGPFAD" ;
 
Zuletzt bearbeitet:

seger85

Benutzer
Mitglied seit
21. Feb 2018
Beiträge
127
Punkte für Reaktionen
0
Punkte
16
Hey mein Lieber,

lange nicht mehr von mir gehört :). Ich bin die letzten Tage nicht weiter gekommen bzw. habe ich auch nicht soviel Zeit gefunden.

Deine TAC Befehl und anschließend alles in ein neues Log schreiben hat super funktioniert. Aber bei den beiden Vorschlägen komme ich nicht weiter:

Ich habe diese Formatierung sowohl bei before als auch ber after übernomen, aber er zeigt mir immer nur Minuten oder Sekunden an. Leider nie beides, mache ich da was falsch?

Zu 1c) Hängt noch von der gewünschten Formatierung ab, bsp für Minuten:Sekunden
Code:
after=$(date +%m:%S)


Diese Lösung will auch nicht so richtig:

Zu 1d) Schnellschuß, Anhängsel/Ergänzung an jede Zeile hinten
Code:
cd ...........\; echo 1>> "$LOGPFAD" ;
[/QUOTE]

Anbei mein momentaner Code zum hineindenken:
Code:
#!/bin/bash
AUSWAHLDATUM="2018-03-16"

QUELLE1="/volume1/DiskStation/- Filme x265 (Neu Test)"
QUELLE2="/volume1/DiskStation/- Filme"
QUELLE3="/volume1/DiskStation/- Kinderfilme"
QUELLE4="/volume1/DiskStation/- Serien"

ZIEL1="/volumeUSB1/usbshare/- Filme x265 (Neu Test)"
ZIEL2="/volumeUSB1/usbshare/- Filme"
ZIEL3="/volumeUSB1/usbshare/- Kinderfilme"
ZIEL4="/volumeUSB1/usbshare/- Serien"

LOGPFADFINAL="/volumeUSB1/usbshare/Log Final.txt"
LOGPFADTEMP="/volumeUSB1/usbshare/Temp.txt"
LOGFEHLERPFAD="/volumeUSB1/usbshare/Fehler.txt"

timestamp() {
  date +"%d.%m.%Y - %T"
}

before=$(date +%m)

echo -e "\n###########################################################################################################################################################" >> $LOGPFADTEMP


cd "$QUELLE1" && find -not \( -path "*@eaDir*" -prune \) -type f -newermt "$AUSWAHLDATUM" -exec cp -uv --parents "{}" "$ZIEL1" 2>> "$LOGFEHLERPFAD" 1>> "$LOGPFADTEMP" \;
cd "$QUELLE2" && find -not \( -path "*@eaDir*" -prune \) -type f -newermt "$AUSWAHLDATUM" -exec cp -uv --parents "{}" "$ZIEL2" 2>> "$LOGFEHLERPFAD" 1>> "$LOGPFADTEMP" \;
cd "$QUELLE3" && find -not \( -path "*@eaDir*" -prune \) -type f -newermt "$AUSWAHLDATUM" -exec cp -uv --parents "{}" "$ZIEL3" 2>> "$LOGFEHLERPFAD" 1>> "$LOGPFADTEMP" \;
cd "$QUELLE4" && find -not \( -path "*@eaDir*" -prune \) -type f -newermt "$AUSWAHLDATUM" -exec cp -uv --parents "{}" "$ZIEL4" 2>> "$LOGFEHLERPFAD" 1>> "$LOGPFADTEMP" \;

echo -e "\nDiese Daten wurden kopiert:" >> $LOGPFADTEMP

gesamtspeicherplatzderfestplatte() {
  df -h /volumeUSB1/usbshare | awk '/^\/volumeUSB1/usbshare { print $2 }' | tail --lines +2 | sed 's/G.*/ Gigabyte/g; s/T.*/ Terabyte/g; s/M.*/Megabyte/g'

}

belegterspeicherplatz() {
  df -h /volumeUSB1/usbshare | awk '/^\/volumeUSB1/usbshare { print $3 }' | tail --lines +2 | sed 's/G.*/ Gigabyte/g; s/T.*/ Terabyte/g; s/M.*/Megabyte/g'

}

freierspeicherplatz() {
  df -h /volumeUSB1/usbshare | awk '/^\/volumeUSB1/usbshare { print $4 }' | tail --lines +2 | sed 's/G.*/ Gigabyte/g; s/T.*/ Terabyte/g; s/M.*/Megabyte/g'
}

belegterspeicherplatzinprozent() {
  df -h /volumeUSB1/usbshare | awk '/^\/volumeUSB1/usbshare { print $5 }' | tail --lines +2
}

after=$(date +%m)


echo -e """\n""Freier Speicherplatz:"" $(freierspeicherplatz) \t\t "Festplatten-Größe:" $(gesamtspeicherplatzderfestplatte)" >> $LOGPFADTEMP
echo -e "\nBelegter-Speicherplatz:" $(belegterspeicherplatz)" \t "Belegter-Speicherplatz:" $(belegterspeicherplatzinprozent)" >> $LOGPFADTEMP
echo -e "\nScript-Laufzeit:" $((after - $before)) "Minuten" >> $LOGPFADTEMP

echo -e "\nStartzeitpunkt: $(timestamp)\n" >> $LOGPFADTEMP

tac "$LOGPFADTEMP" | sed 's/^.*-> //' > "$LOGPFADFINAL"

##########################################

Würde mich freuen, wenn du noch ein paar Tipps oder Vorschläge hättest.

Viele Grüße
Seger
 

Fusion

Benutzer
Sehr erfahren
Mitglied seit
06. Apr 2013
Beiträge
14.137
Punkte für Reaktionen
898
Punkte
424
zu 1d) was heißt "auch nicht so richtig"? Wie ist denn der konkrete Code den du probiert hast?

zu 1c) Das Format ist %M:%S, aber ich muss nochmal überlegen wegen der Differenz.

Und du könntest die Log-Dateien noch mit einem Datum im Name versehen, außer du willst alles in einer Datei sammeln.
Dann hätte man auch die temp Dateien oder ähnliches am Ende noch löschen können.
 

seger85

Benutzer
Mitglied seit
21. Feb 2018
Beiträge
127
Punkte für Reaktionen
0
Punkte
16
Folgendes hatte ich probiert:

Code:
 cd "$QUELLE1" && find -not \( -path "*@eaDir*" -prune \) -type f -newermt "$AUSWAHLDATUM" -exec cp -uv --parents "{}" "$ZIEL1" 2>> "$LOGFEHLERPFAD" 1>> "$LOGPFADTEMP" \; echo 1>> "$LOGPFADTEMP" ;

Edit: folgenden Fehler komme ich dann:
Code:
find: paths must precede expression: echo
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

und beim Datum:
Code:
before=$(date +%M:%S)

after=$(date +%M:%S)

echo -e "\nScript-Laufzeit:" $((after - $before)) "Minuten" >> $LOGPFADTEMP

Ja löschen würde wohl Sinn machen, mehrere LOGs würde ich nicht haben wollen, sonst hätten wir ja nicht umdrehen müssen. So kann ich nach ein paar Tagen in einer Datei schnell nachvollziehen was das Skript gemacht hat. Schläfst du eigentlich nie, danke für deine Hilfe :). Klasse wie schnell du immer hilfst.

VG
Seger
 

Fusion

Benutzer
Sehr erfahren
Mitglied seit
06. Apr 2013
Beiträge
14.137
Punkte für Reaktionen
898
Punkte
424
ok, also für die Zeitdifferenz

Rich (BBCode):
before=$(date)
after=$(date)
timeDiff=$(date -u -d @$(($(date -d "$after" '+%s') - $(date -d "$before" '+%s'))) '+%T')
echo -e "\nScript-Laufzeit:" $timeDiff "HH:mm:ss" >> $LOGPFADTEMP

%T ist eben in Stunden Minuten Sekunden
Einzeln kannst auch '+%M:%S' für deine Ausgabe in "Minuten" nutzen
Rich (BBCode):
timeDiff=$(date -u -d @$(($(date -d "$after" '+%s') - $(date -d "$before" '+%s'))) '+%M:%S')
echo -e "\nScript-Laufzeit:" $timeDiff "Minuten" >> $LOGPFADTEMP

Zur Leerzeile, zwei Ideen
Rich (BBCode):
find -not
ersetzen mit
find . -not
oder du schreibst das echo mal in eine neue Zeile
Rich (BBCode):
cd......\;
echo 1>> "$LOGPFADTEMP" ;
cd......\;
echo......
 

seger85

Benutzer
Mitglied seit
21. Feb 2018
Beiträge
127
Punkte für Reaktionen
0
Punkte
16
Hey mein Lieber,

total genial mit der neuen Formel und der Variablen für die Skript-Laufzeit. Durch die neue Schreibweise und dem richtigen von einander abziehen funktioniert es zu 100%.
Nur noch eine Verständnisfrage, kann ich eigentlich die beiden Varianten (before & timeDiff) oben platzieren und after übergibt seinen wert zum ende an timeDiff?
Oder muss rein aus der Logik erst der Wert after generiert werden um anschließend von timeDiff aufgegriffen zu werden -Blöd geschrieben aber vielleicht verstehst du meine Frage :)?

Die Leerzeile inkl. der Zeilenzeichen "#" habe ich jetzt mit der sebaraten Zeile gelöst, finde das optisch so total klasse!

Den Log finde ich jetzt total aufgeräumt und sauber, zeige den aktuellen Status vom Skript und Log gleich nochmal.

Sag mal, bei dem TAC-Befehl:

Code:
 tac "$LOGPFADTEMP" | sed 's/^.*-> //' > "$LOGPFADFINAL"
haben wir dafür gesorgt, dass er alles vor dem Zeichen "->" weglässt aber ich würde gern das Zeichen "->" immer noch am Anfang stehen lassen wollen, sodass die Zeilen immer alle sauber mit "->" beginnen. Ich habe schon versucht eine Zeichenfolge zu definieren, damit er sed das Zeichen stehen lässt, aber das ist keine schlaue Idee, weil er dann am Ende aus anderen Begrifflichkeiten Zeichen entfernt.

Hab mich zwar eingelesen, aber irgendwie bekomme ich es nicht hin. Man kann wohl mit Sed auch noch Textzeichen hinzufügen, das wäre nämlich die Lösung. Weißt du an welcher Stelle ich das setzen muss (aber auch nicht wichtig, ist alles nur Spielerei um weiter zu lernen/probieren und hübscher zu machen)?

Danke für alles bis, echt genial wie du mich hier durchführst. Hab dir auch eine PN gesendet :).


Code:
#!/bin/bash
AUSWAHLDATUM="2018-03-16"

QUELLE1="/volume1/DiskStation/- Filme x265 (Neu Test)"
QUELLE2="/volume1/DiskStation/- Filme"
QUELLE3="/volume1/DiskStation/- Kinderfilme"
QUELLE4="/volume1/DiskStation/- Serien"

ZIEL1="/volumeUSB1/usbshare/- Filme x265 (Neu Test)"
ZIEL2="/volumeUSB1/usbshare/- Filme"
ZIEL3="/volumeUSB1/usbshare/- Kinderfilme"
ZIEL4="/volumeUSB1/usbshare/- Serien"

LOGPFADFINAL="/volumeUSB1/usbshare/Log Final.txt"
LOGPFADTEMP="/volumeUSB1/usbshare/Temp.txt"
LOGFEHLERPFAD="/volumeUSB1/usbshare/Fehler.txt"

timestamp() {
  date +"%d.%m.%Y - %T"
}

before=$(date)

echo -e "\n###########################################################################################################################################################" >> $LOGPFADTEMP


cd "$QUELLE1" && find -not \( -path "*@eaDir*" -prune \) -type f -newermt "$AUSWAHLDATUM" -exec cp -uv --parents "{}" "$ZIEL1" 2>> "$LOGFEHLERPFAD" 1>> "$LOGPFADTEMP" \;
echo -e "\n###########################################################################################################################################################" >> $LOGPFADTEMP
cd "$QUELLE2" && find -not \( -path "*@eaDir*" -prune \) -type f -newermt "$AUSWAHLDATUM" -exec cp -uv --parents "{}" "$ZIEL2" 2>> "$LOGFEHLERPFAD" 1>> "$LOGPFADTEMP" \;
echo -e "\n###########################################################################################################################################################" >> $LOGPFADTEMP
cd "$QUELLE3" && find -not \( -path "*@eaDir*" -prune \) -type f -newermt "$AUSWAHLDATUM" -exec cp -uv --parents "{}" "$ZIEL3" 2>> "$LOGFEHLERPFAD" 1>> "$LOGPFADTEMP" \;
echo -e "\n###########################################################################################################################################################" >> $LOGPFADTEMP
cd "$QUELLE4" && find -not \( -path "*@eaDir*" -prune \) -type f -newermt "$AUSWAHLDATUM" -exec cp -uv --parents "{}" "$ZIEL4" 2>> "$LOGFEHLERPFAD" 1>> "$LOGPFADTEMP" \;
echo -e "\n###########################################################################################################################################################" >> $LOGPFADTEMP

echo -e "\nDiese Daten wurden kopiert:" >> $LOGPFADTEMP

gesamtspeicherplatzderfestplatte() {
  df -h /volumeUSB1/usbshare | awk '/^\/volumeUSB1/usbshare { print $2 }' | tail --lines +2 | sed 's/G.*/ Gigabyte/g; s/T.*/ Terabyte/g; s/M.*/Megabyte/g'

}

belegterspeicherplatz() {
  df -h /volumeUSB1/usbshare | awk '/^\/volumeUSB1/usbshare { print $3 }' | tail --lines +2 | sed 's/G.*/ Gigabyte/g; s/T.*/ Terabyte/g; s/M.*/Megabyte/g'

}

freierspeicherplatz() {
  df -h /volumeUSB1/usbshare | awk '/^\/volumeUSB1/usbshare { print $4 }' | tail --lines +2 | sed 's/G.*/ Gigabyte/g; s/T.*/ Terabyte/g; s/M.*/Megabyte/g'
}

belegterspeicherplatzinprozent() {
  df -h /volumeUSB1/usbshare | awk '/^\/volumeUSB1/usbshare { print $5 }' | tail --lines +2
}

after=$(date)
timeDiff=$(date -u -d @$(($(date -d "$after" '+%s') - $(date -d "$before" '+%s'))) '+%M:%S')


echo -e """\n""Freier Speicherplatz:"" $(freierspeicherplatz) \t\t "Festplatten-Größe:" $(gesamtspeicherplatzderfestplatte)" >> $LOGPFADTEMP
echo -e "\nBelegter-Speicherplatz:" $(belegterspeicherplatz)" \t "Belegter-Speicherplatz:" $(belegterspeicherplatzinprozent)" >> $LOGPFADTEMP
echo -e "\nScript-Laufzeit:" $timeDiff "Minuten" >> $LOGPFADTEMP

echo -e "\nStartzeitpunkt: $(timestamp)\n" >> $LOGPFADTEMP

tac "$LOGPFADTEMP" | sed 's/^.*-> //' > "$LOGPFADFINAL"

Das aktuelle Log:
Code:
Startzeitpunkt: 23.03.2018 - 18:31:42

Script-Laufzeit: 00:02 Minuten

Belegter-Speicherplatz: 67 Gigabyte 	 Belegter-Speicherplatz: 4%

Freier Speicherplatz: 1.8 Terabyte 		 Festplatten-Größe: 1.9 Terabyte

Diese Daten wurden kopiert:

###########################################################################################################################################################

###########################################################################################################################################################

###########################################################################################################################################################

###########################################################################################################################################################
'/volumeUSB1/usbshare/- Filme x265 (Neu Test)/./Testfilm (2017)/Testfilm (2017).mkv'
/volumeUSB1/usbshare/- Filme x265 (Neu Test)/./Testfilm (2017)
###########################################################################################################################################################

Viele Grüße und ein erholsames Wochenende!
Seger
 

Fusion

Benutzer
Sehr erfahren
Mitglied seit
06. Apr 2013
Beiträge
14.137
Punkte für Reaktionen
898
Punkte
424
Also den Zeilenanfang kannst du mit dem Stream-Editor sed mit dem wir auch die "Löschung" vornehmen wieder einbauen.
Folgend der Aufbau des Befehls.
Code:
sed 's/^.*-> //'
sed 's/suchString/ersetzeMit/'
Der Such-String aufgedröselt
Code:
^ ..beginne am Zeilenanfang
.* ..jedes beliebige Zeichen in belieber Wiederholung
-> ..diese Zeichen stehen für sich selbst, gefolgt von einem Leerzeichen
Also, suche vom Zeilen Anfang, bis du irgendwo "-> " findest.
Den ersetzeMit String haben wir leer gelassen, also mit Nichts ersetzt.
Willst du also das Zeichen behalten, einfach
[code]
sed 's/^.*-> /-> /'

Zur Zeit:
Ja, es ist in diesem Fall relevant wo before, after und timeDiff (alles frei gewählte Bezeichnungen) stehen.
before und after werden exakt dort im Ablauf des scripts mit dem aktuellen Datum/Zeit wo sie stehen. Schreibt man sie beide an den Anfang ist die Differenz vermutlich nicht mal eine Milli-Sekunde.
timeDiff kannst du auch erst aufrufen, wenn alle dort benutzen Variablen mit Inhalt versehen sind, andernfalls würde er versuchen z.B. einen Text-String von einer Zeit abzuziehen. Das kann nur scheitern.

Für deine Sektions-Trennung geht es auch noch eleganter. Anstatt dieser hässlichen echo Zeile folgendes (gibt 50 Mal # aus):
Code:
awk 'BEGIN{c=0; do{printf "#"; c++}while(c<50); printf "\n"}' >> $LOGPFADTEMP
Oder Alternative (gibt # mit Leerzeichen aus):
Code:
echo -e ''\n$_{1..50}'\b+' >> $LOGPFADTEMP
 

seger85

Benutzer
Mitglied seit
21. Feb 2018
Beiträge
127
Punkte für Reaktionen
0
Punkte
16
Hey mein Lieber,

herzlichen Dank, hat natürlich alles funktioniert und es sieht alles super aus :).
Deine Erklärungen sind einfach der Hammer, echt genial, Danke!

Sag mal, weißt du wie ich z.B. den Text: "Diese Daten wurden kopiert:" im Log fett, unterstrichen und z.B. rot darstelle?
flgendes habe ich bereits versucht:
Code:
echo -e "\n \033[1;4;31mDiese Daten wurden kopiert:\033[0m" >> $LOGPFADTEMP


So sieht der Code momentan aus:

Code:
#!/bin/bash
AUSWAHLDATUM="2018-03-16"

QUELLE1="/volume1/DiskStation/- Filme x265 (Neu Test)"
QUELLE2="/volume1/DiskStation/- Filme"
QUELLE3="/volume1/DiskStation/- Kinderfilme"
QUELLE4="/volume1/DiskStation/- Serien"

ZIEL1="/volumeUSB1/usbshare/- Filme x265 (Neu Test)"
ZIEL2="/volumeUSB1/usbshare/- Filme"
ZIEL3="/volumeUSB1/usbshare/- Kinderfilme"
ZIEL4="/volumeUSB1/usbshare/- Serien"

LOGPFADFINAL="/volumeUSB1/usbshare/Log Final.txt"
LOGPFADTEMP="/volumeUSB1/usbshare/Temp.txt"
LOGFEHLERPFAD="/volumeUSB1/usbshare/Fehler.txt"

timestamp() {
  date +"%d.%m.%Y - %T"
}

before=$(date)


cd "$QUELLE1" && find -not \( -path "*@eaDir*" -prune \) -type f -newermt "$AUSWAHLDATUM" -exec cp -uv --parents "{}" "$ZIEL1" 2>> "$LOGFEHLERPFAD" 1>> "$LOGPFADTEMP" \; | awk 'BEGIN{c=0; do{printf "X"; c++}while(c<120); printf "\n \n"}' >> $LOGPFADTEMP
cd "$QUELLE2" && find -not \( -path "*@eaDir*" -prune \) -type f -newermt "$AUSWAHLDATUM" -exec cp -uv --parents "{}" "$ZIEL2" 2>> "$LOGFEHLERPFAD" 1>> "$LOGPFADTEMP" \; | awk 'BEGIN{c=0; do{printf "#"; c++}while(c<120); printf "\n \n"}' >> $LOGPFADTEMP
cd "$QUELLE3" && find -not \( -path "*@eaDir*" -prune \) -type f -newermt "$AUSWAHLDATUM" -exec cp -uv --parents "{}" "$ZIEL3" 2>> "$LOGFEHLERPFAD" 1>> "$LOGPFADTEMP" \; | awk 'BEGIN{c=0; do{printf "#"; c++}while(c<120); printf "\n \n"}' >> $LOGPFADTEMP
cd "$QUELLE4" && find -not \( -path "*@eaDir*" -prune \) -type f -newermt "$AUSWAHLDATUM" -exec cp -uv --parents "{}" "$ZIEL4" 2>> "$LOGFEHLERPFAD" 1>> "$LOGPFADTEMP" \; | awk 'BEGIN{c=0; do{printf "#"; c++}while(c<120); printf "\n \n"}' >> $LOGPFADTEMP


echo -e "\nDiese Daten wurden kopiert:" >> $LOGPFADTEMP

gesamtspeicherplatzderfestplatte() {
  df -h /volumeUSB1/usbshare | awk '/^\/volumeUSB1/usbshare { print $2 }' | tail --lines +2 | sed 's/G.*/ Gigabyte/g; s/T.*/ Terabyte/g; s/M.*/Megabyte/g'

}

belegterspeicherplatz() {
  df -h /volumeUSB1/usbshare | awk '/^\/volumeUSB1/usbshare { print $3 }' | tail --lines +2 | sed 's/G.*/ Gigabyte/g; s/T.*/ Terabyte/g; s/M.*/Megabyte/g'

}

freierspeicherplatz() {
  df -h /volumeUSB1/usbshare | awk '/^\/volumeUSB1/usbshare { print $4 }' | tail --lines +2 | sed 's/G.*/ Gigabyte/g; s/T.*/ Terabyte/g; s/M.*/Megabyte/g'
}

belegterspeicherplatzinprozent() {
  df -h /volumeUSB1/usbshare | awk '/^\/volumeUSB1/usbshare { print $5 }' | tail --lines +2
}

after=$(date)
timeDiff=$(date -u -d @$(($(date -d "$after" '+%s') - $(date -d "$before" '+%s'))) '+%M:%S')


echo -e """\n""Freier Speicherplatz:"" $(freierspeicherplatz) \t\t "Festplatten-Größe:" $(gesamtspeicherplatzderfestplatte)" >> $LOGPFADTEMP
echo -e "\nBelegter-Speicherplatz:" $(belegterspeicherplatz)" \t "Belegter-Speicherplatz:" $(belegterspeicherplatzinprozent)" >> $LOGPFADTEMP
echo -e "\nScript-Laufzeit:" $timeDiff "Minuten/Sekunden" >> $LOGPFADTEMP

echo -e "\nStartzeitpunkt: $(timestamp)\n" >> $LOGPFADTEMP

tac "$LOGPFADTEMP" | sed 's/^.*-> /-> /' > "$LOGPFADFINAL"

DANKE DANKE!

Wenn du natürlich zu den weiteren Punkten noch Ideen hast, bin ich natürlich dankbar für Ideen und Hilfe.

Viele Grüße
Seger
 

Fusion

Benutzer
Sehr erfahren
Mitglied seit
06. Apr 2013
Beiträge
14.137
Punkte für Reaktionen
898
Punkte
424
Die Farbausgabe ist für das Terminal. Dort funktioniert dein Code auch (also OHNE >> Log)
Das Logfile das du schreibst ist reiner ASCII Text.
Um hier wieder Farben zu sehen müsste man im Logfile Formatierungen unterbringen die das Betrachtungsprogramm das man verwendet wieder in Farben/Formate umsetzt.
Also einfach Zeichen ins Log zu schreiben und die machen dann ein Stück Text fett/rot egal wie du das Log betrachtest wird (denke ich) nicht gehen.
 

seger85

Benutzer
Mitglied seit
21. Feb 2018
Beiträge
127
Punkte für Reaktionen
0
Punkte
16
Die gute Nachricht ist, dass der Code funktioniert hätte :).

Danke dir für die schnelle Reaktion und der helfenden Erklärung.
War auch nur eine Idee und eher als Lernprojekt zu sehen.

So wie schon häufig erwähnt bin ich total glücklich und dankbar, vielleicht können wir uns/du dich ja nochmal den anderen Punkten widmen.
Aber wie schon gesagt, wir können jederzeit aufhören, da ich schon total zufrieden bin.

Viele Grüße
Seger
 

Fusion

Benutzer
Sehr erfahren
Mitglied seit
06. Apr 2013
Beiträge
14.137
Punkte für Reaktionen
898
Punkte
424
Welche anderen Punkte (zumindest Stichpunkte), ich pflege keine offene Punkte Liste hier neben dem Bildschirm?
 

seger85

Benutzer
Mitglied seit
21. Feb 2018
Beiträge
127
Punkte für Reaktionen
0
Punkte
16
Hab die Liste von der Seite 5 nochmal kopiert. Den Punkt Log haben wir ja schon erfolgreich abgearbeitet :).

Nun sind eigentlich nur noch die Punkte „neue Funktionen“ und „optional“ übrig.

Du selbst hattest noch den Punkt des löschen des Logs. Was ich aber nicht unbedingt als notwendig ersehe, glaube ich :).

Dann fällt mir nich was ein was irgendwie spannend wäre, aber nicht notwendig. Gibt es eigentlich ne Möglichkeit über das NAS eine bestimmte Datei (Log) nach Abschluss per Mail zu versenden?


LOG
1. Log anders herum sortieren (sprich, der neuste Eintrag immer oben)
1b. Wegen der Übersichtlichkeit erst ab "->" das Log darstellen
1c. Ich habe am Log rum gespielt und bin von Sekunden auf Minuten gegangen, weißt du wie ich auch Minuten und Sekunden anzeigen kann? %m%s funktionierte nicht.
1d. Zwischen den Pfaden noch immer ein Leerzeile hinzufügen, setze ich das einfach so:
Code:
cd "\n$QUELLE2"
, oder muss ich das \n wo anders setzen?

Neue Funktionen
2. Schleifen, Variable setzen für Quellen oder Arrays (was du glaubst was das Beste ist)

3. Quellpfad/"Ordnername" auf Zielpfad erstellen, wenn nicht vorhanden. Sonst nichts machen (ist ja eine Form von Schleife) - Dadurch und durch Punkt 2 wird das Skript ziemlich universell (vielleicht auch für andere User)

Optional
4. Optional weil blöder Punkt: Ø Übertragungsrate des Kopiervorgangs (in MB/s)

Viele Grüße
seger
 

PsychoHH

Benutzer
Mitglied seit
03. Jul 2013
Beiträge
2.967
Punkte für Reaktionen
4
Punkte
78
Nur gerade zusammengeschrieben, nicht getestet.
Warum aber nicht einfach so alles als Schleife?
Rich (BBCode):
QUELLPFAD="/volume1/DiskStation"
ZIELPFAD="/volumeUSB1/usbshare"
LOGPFADFINAL="$ZIELPFAD/Log Final.txt"
LOGPFADTEMP="$ZIELPFAD/Temp.txt"
LOGFEHLERPFAD="$ZIELPFAD/Fehler.txt"
QUELLEN="- Filme x265 (Neu Test)"
- Filme
- Kinderfilme
- Serien"


 ### Befehle .. 


for QUELLE in $QUELLEN; do
    cd "$QUELLPFAD/$QUELLE" && find -not \( -path "*@eaDir*" -prune \) -type f -newermt "$AUSWAHLDATUM" -exec cp -uv --parents "{}" "$$ZIELPFAD/$QUELLE" 2>>     "$LOGFEHLERPFAD" 1>> "$LOGPFADTEMP" \; | awk 'BEGIN{c=0; do{printf "X"; c++}while(c<120); printf "\n \n"}' >> $LOGPFADTEMP
done
 

seger85

Benutzer
Mitglied seit
21. Feb 2018
Beiträge
127
Punkte für Reaktionen
0
Punkte
16
Hey mein Lieber @Fusion,

ich bastel mir gerade wieder voll einen ab, denke da irgendwie total verkehrt?

Die originale Codezeile ist diese:

Rich (BBCode):
cd "$QUELLE1" && find -not \( -path "*@eaDir*" -prune \) -type f -newermt "$AUSWAHLDATUM" -exec cp -uv --parents "{}" "$ZIEL1" 2>> "$LOGFEHLERPFAD" 1>> "$LOGPFADTEMP" \; | awk 'BEGIN{c=0; do{printf "X"; c++}while(c<120); printf "\n \n"}' >> $LOGPFADTEMP

nun würde ich aber gern noch neben dem Auschluss von -path einige Dateitypen, wie z.B. .nfo & .jpg Dateien ausschließen.
Setze ich vielleicht was an falscher Stelle oder geht das nicht, das ich ganze Pfade und Dateitypen ausschließe?

Rich (BBCode):
cd "$QUELLE1" && find -not \( -path "*@eaDir*" -prune \) -type f \( -name "*.nfo" -or -name "*.jpg" \) -newermt "$AUSWAHLDATUM" -exec cp -uv --parents "{}" "$ZIEL1" 2>> "$LOGFEHLERPFAD" 1>> "$LOGPFADTEMP" \; | awk 'BEGIN{c=0; do{printf "X"; c++}while(c<120); printf "\n \n"}' >> $LOGPFADTEMP

Würde mich sehr freuen, wenn du wieder unter die Arme greifen kannst.

Viele Grüße
Seger
 
Zuletzt bearbeitet:
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat