Brauche einfache Bash hilfe (Datum automatisiert)?

5 Antworten

Hallo

Ich möchte gern, das automatisch ein Datum an die Datei geschrieben wird. z.b. datei-20170623 für das Backup von heute

So zum Beispiel könnte das Script aussehen:

#/bin/bash
# backup_a_file.sh
FILENAME="$(date +%A_%d.%m.%Y_%H:%M:%S)"
cp /home/user11/datei.sh /var/backup/datei$FILENAME.sh
if [ $(ls -1|wc -l) -gt "6" ];
then
rm -f $(ls -1t|head -n2|tail -n1)
fi
exit 0

"Der Cronjob sähe dann so aus:

18 * * * /pfad/wo/es/liegt/backup_a_file.sh

Linuxhase

Woher ich das weiß:eigene Erfahrung – Ich benutze seit 2007 Linux und habe LPIC101 und LPIC102
Takiry 
Fragesteller
 24.06.2017, 02:19

Danke ich habe es jedoch schon so hier gelöst:

rm ./Backup/datei.sh.*.`date +%u`
cp ./datei.sh ./Backup/datei.sh.`date +%Y%m%d.%u`

ich hätte zwar zumindest um den löschbefehl ein "if" setzen können um die ersten 7 Tage die Fehlermeldung nicht zu haben aber für meine zwecke reichte das :)

Danke und Gruß

1

Ich wüde ein kleines Script machen, das wird sonst etwas unübersichtlich in der crontab.

Zum Kopieren mit dem Datum im Dateinamen (Datumsformat anpassbar, siehe "man date"):

#!/bin/bash
DATE=`date +%Y-%m-%d`
cp datei1.sh datei-$DATE.sh


Zum Entfernen von allem was älter als eine bestimmte Zeit ist:

find ./verzeichnis -mmin +10080 -exec rm {} \;

Entfernt beispielsweise alles im Verzeichnis was älter als 7 Tage ist (Achtung, gefährlich). Ginge natürlich auch mit obigem Script, einfach umgekehrt.

Die beiden Befehle kannst du in ein script packen.

kernash  23.06.2017, 10:51

Das Datum von vor einer Woche wäre dann:

DATE=`date --date "1 week ago" +%Y-%m-%d`
0
Takiry 
Fragesteller
 23.06.2017, 14:39
@kernash

Danke an den find/exec befehl habe ich garnicht mehr gedacht... ich hatte mich so auf den dateinamen fixiert. Aber du hast recht das ist natürlich deutlich einfacher.

Danke für die ausführliche antwort. 

0

Ich würde den find-Befehl noch etwas mehr spezifizieren (genauer Pfad, type, iname) damit nichts hart schief gehen kann.

Achtung!!! den Befehl habe ich nicht getestet
find /DEINPFAD/ -type f -iname "datei*.sh" -mtime -7 -print0 | xargs -0 -I {} rm {}

Tuxgamer2  23.06.2017, 11:39

Wieso verwendest du nicht einfach -delete Option von find?

Kannst statt -print0 | xargs -0 -I {} rm {} auch einfach -delete angeben.

Also:

find /DEINPFAD/ -type f -iname "datei*.sh" -mtime -7 -delete

sollte doch genau das machen, was du geschrieben hast.

0
hackspoiler  23.06.2017, 11:46
@Tuxgamer2

Ganz einfach, weil du mit xargs die Aufgaben parallelisieren kannst wenn du lustig bist, das gibt gut speed bei vielen Dateien und wenn man sich entschließt die Dateien nicht zu löschen sondern nur zu archivieren/moven musst du nur den rm befehl mit dem tar oder mv-Befehl austauschen. Also es ist meiner meinung nach flexibler

0
Tuxgamer2  23.06.2017, 12:25
@hackspoiler

Flexibilitäts-Argument lass ich zählen.

Dass exec aber schneller ist, bezweifele ich. Ohne es getestet zu haben, aber laut manual ist -delete am schnellsten:

https://www.gnu.org/software/findutils/manual/html\_node/find\_html/Deleting-Files.html

The most efficient and secure method of solving this problem is to use
the ‘-delete’ action:

     find /var/tmp/stuff -mtime +90 -delete


This alternative is more efficient than any of the ‘-exec’ or
‘-execdir’ actions, since it entirely avoids the overhead of
forking a new process and using exec to run /bin/rm. It
is also normally more efficient than xargs for the same
reason. The file deletion is performed from the directory containing
the entry to be deleted, so the ‘-delete’ action has the same
security advantages as the ‘-execdir’ action has.



0
hackspoiler  23.06.2017, 12:45
@Tuxgamer2

Hey danke das du flexibilität supportest ;)

Das exec-Argument von dir lass ich zählen aber wo bitteschön benutze ich exec???

0
Tuxgamer2  23.06.2017, 16:01
@hackspoiler

Da habe ich mich halt verschrieben.

Wenn du den Link mal anschaust - oder dir anschaust, was ich daraus zitiert habe - steht da, dass -delete normalerweise schneller ist als exec UND print + xargs.

0
Takiry 
Fragesteller
 23.06.2017, 14:47

Ich habe es direkt über die Wochentage mit "date %u" realisiert. das war weniger schreibarbeit und es kann nicht sein, dass mal was ausversehen gelöscht wird.

Danke Gruß

0

kernash hat deine Frage ja schon sehr gut beantwortet.

Unabhängig davon:

sudo in einem crontab ist aber nicht die beste Lösung. Führe doch einfach crontab -e als root aus - dann läuft dein Skript komplett als root und du brauchst kein sudo.

hackspoiler  23.06.2017, 11:54

Man führt normalerweise keine kritischen Befehle als root aus sondern man führt den Befehl als der User aus, dem die Dateien die gelöscht werden sollen, gehören. Dann fällt auch das sudo weg :)

0
Tuxgamer2  23.06.2017, 12:08
@hackspoiler

man führt den Befehl als der User aus, dem die Dateien die gelöscht werden sollen, gehören.

Das ist nicht ganz richtig.

Zum Löschen ist es bekanntlich völlig irrelevant, wem die Dateien gehören. Löschen kannst du nur, wenn du Schreibrechte (und x) auf dem Verzeichnis besitzt, in dem die Datei liegt.

Hast du diese nicht, kannst du die Datei nicht löschen - ja, auch wenn du der Besitzer der Datei bist.

Und wer ist denn default der Besitzer von "/var/backup"?

Yep: root

Von daher kann man es sicherlich auch anders machen, wenn man es anders will. Aber ich sehe kein Problem, die Skripte als root auszuführen.

0
hackspoiler  23.06.2017, 12:57
@Tuxgamer2

"Das ist nicht ganz richtig"
Natürlich ist das richtig. Solange du Besitzer bist

"Löschen kannst du nur, wenn du Schreibrechte (und x) auf dem Verzeichnis besitzt"

Mach doch mal aus Spass den Gegentest als normaler User:
touch test.log && chmod 000 test.log
rm -rf test.log

Und wenn du schon mit "default" kommst. Defaultmässig hat der User der die Datei anlegt die nötigen Berechtingunge seine Files zu löschen.

0
Tuxgamer2  23.06.2017, 13:32
@hackspoiler

Man könnte meinen, das Unix-Rechtesystem wäre total easy. Vor allem verglichen, was Windows so hat.

Umso erstaunlicher, dass das trotzdem viele nicht wirklich verstanden haben.

touch test.log && chmod 000 test.log
rm -rf test.log

Ist mir bewusst, dass das geht. Das liegt aber nicht daran, dass du Besitzer der Datei bist - denn wenn du eine Datei löscht, sidn die Rechte der Datei irrelevant (mal abgesehen von vielleicht "die Datei ist schreibgeschützt"-Abfragen, wenn man das -f nicht verwendet).

Wie bereits gesagt: Es kommt einzig und allein auf die Rechte des Verzeichnisses an.

Mach mal den Test:

https://pastebin.com/z0FptL9R

Wie du siehst, kann es durchaus vorkommen, dass du eine Datei nicht löschen kannst, obwohl du diese besitzt. Es kann auch sein, dass du eine Datei löschen kannst, die root besitzt und auf die du keine Rechte hast.

Auf die Verzeichnisrechte kommt es beim Löschen an.

Wieder etwas dazugelernt ;).

Und wenn du schon mit "default" kommst. Defaultmässig hat der User der die Datei anlegt die nötigen Berechtingunge seine Files zu löschen.

Jaaaa....

Die Voraussetzungen um Dateien anzulegen sind eben die gleichen wie um sie zu löschen. In beiden Fällen eben Schreib und x-Rechte.

Das heißt, kannst du eine Datei in einem Ordner erstellen, kannst du in diesem Ordner auch Dateien löschen.

0
hackspoiler  23.06.2017, 15:17
@Tuxgamer2

Ist Zuckersüss das du so auf deine Verzeichnisrechte-Predigt bestehst obwohl keiner was dagegen gesagt hat und ich bin mir sicher er ist nicht auf den Kopf gefallen und weiß was er wo wie löschen darf sonst hätte er auch nach der Berechtigung gefragt. Also lass mal die Klugsheißeritis weg und mach es für den Jungen hier nicht komplexer als es eigentlich ist dann ist dir auch ein imaginärer Lolli sicher.

  • Er hat die Dateien angelegt also hat er auch die Rechte da drauf! Sonst hätte er sie auch nicht anlegen können.
  • Als Root "rm" in einem cronjob ausführen ist schlechte Schule! Das sagt dir jeder Pro = Ein Anfänger mit rm Erfahrung
  • Sein vorhaben sollte in ein Skript ausgelagert werden. Ist sauberer, flexibler und modularer
  • Wenn er nach Performance strebt dann sollte er sich xargs anstelle von exec und -delete ansehen
  • Der cronjob sollte nur das machen für was es auch anfangs gedacht wurde: "Etwas stupide zu einer bestimmten Zeit ausführen und keine Programmierlogiken
  • Fertig!
0
guenterhalt  23.06.2017, 15:55
@Tuxgamer2

Hast du diese nicht, kannst du die Datei nicht löschen - ja, auch wenn du der Besitzer der Datei bist.

darauf sind schon Viele reingefallen!

Wenn du der Besitzer bist, kannst du jederzeit die Rechte so setzen, wie du sie brauchst. Linux umgeht das ( weil es der Owner ohnehin machen kann) und löscht die Datei, auch wenn write gemäß Zugriffsrechte nicht zulässig ist.
(write bedeutet verändern und da ist Löschen eingeschlossen)


1
Tuxgamer2  23.06.2017, 16:07
@guenterhalt

@guenterhalt

Jetzt darfst du mal raten, wieso ein Verzeichnis Schreib-Rechte haben kann.

Würde mich wirklich mal interessieren, was ihr alle denkt, dass die bewirken.

Tipp: Write bei einem Verzeichnis bedeutet: Fähigkeit Dateien anlegen oder löschen.

Wenn du Owner einer Datei bist, kannst du den Dateiinhalt komplett löschen. Das die Datei aber ganz gelöscht ist, musst du das im Verzeichnis reinschreiben. Und dafür brauchst du Schreibrechte für das Verzeichnis.

Ich kann sogar eine Datei mit 0 Berechtigungen und ohne Owern zu sein löschen, wenn ich Schreibrechte im Verzeichnis habe.

Auch für dich - wenn du mir nicht glaubst - der Beweis zum selbst ausführen:

https://pastebin.com/z0FptL9R

0
Tuxgamer2  23.06.2017, 16:17
@hackspoiler

Um eines mal klarzustellen: Ich rede gerade mit dir und nicht mit dem Fragesteller.

Ich habe einzig und allein geschrieben, dass es doch besser ist Sachen direkt mit root auszuführen als mit dem sudo-Hack. Einziger Inhalt meiner Antwort. Wirst du mir doch zustimmen, oder?

Du hast darauf einen Kommentar geschrieben, der gezeigt hat, dass du das Unix-Rechtesystem nicht beherrscht.

Ich habe dies richtig gestellt und dir erklärt, wie es tatsächlich mit Unix-Rechtesystem aussieht.

Wenn du noch weitere Tipps für Takiry hast, kannst du die gerne schreiben. Dann aber wohl in einer eigenen Antwort - und nicht in einem Kommentar unter meiner Antwort.

Aber:

Root besser als sudo

Berechtigung zum Löschen ist einzig und allein durch Verzeichnis-Berechtigung bestimmt

Die 2 Sachen jetzt klar? Dann wären wir ja fertig.

0
guenterhalt  23.06.2017, 20:16
@Tuxgamer2

@Tuxgamer2 da habe ich deinen Beitrag wohl nicht richtig gelesen.

Mein Kommentar mit "hereingefallen" bezog sich nur auf die Rechte der zu löschenden Datei.
Was das Schreiben im betreffenden Directory betrifft, dann sind deine Bemerkungen durchaus richtig.
Wenn
ein "nicht-owner" eine Datei löschen kann, dann erfolgt das in der
Regel über die Gruppen-Schreibrechte. Wer das großzügig zulässt kann
schon Pech haben.

Würde mich wirklich mal interessieren, was ihr alle denkt, dass die bewirken.

Was denkst du, was ein Rentner, der mal Linux-Systemadministrator war, so denkt?

0
Tuxgamer2  23.06.2017, 22:26
@guenterhalt

@guenterhalt

Wenn
ein "nicht-owner" eine Datei löschen kann, dann erfolgt das in der
Regel über die Gruppen-Schreibrechte.

Wieso?

Kann doch genauso gut über Owner-Schreibrechte des Ordners gehen. Und ob ich Owner der Datei bin, ist beim Löschen sowieso egal.

0
Takiry 
Fragesteller
 23.06.2017, 14:51

Ohje da habe ich ja wieder was angerichtet...

Also sudo wird in meinem fall wirklich nicht benötigt. Das ist grundsätzlich richtig. Warum das noch da oben steht hatte ich oben gerade schon geschrieben. Ich habe es auf einem halb fertigen Script kopiert indiesem Script hatte ich sudo gebraucht da es von einem kleinen nutzer ausgeführt wurde zu testzwecken. 

Also es war nur ein kleiner fehler von mir. Bitte nciht desswegen streiten. Ich denke wann wo wer welche Dateien löschen darf ist jedem klar. bei einigen Daten ist nun mal root der einzige der es darf darum wird sudo gebraucht. in meinem fall später wird dies nicht der fall sein aber das geht jetzt zu weit in die materie was ich vor haben...

Gruß und Danke

0
hackspoiler  23.06.2017, 15:24
@Takiry

Wir streiten uns doch gar nicht ;) Du weißt doch wie das bei den Jungs ist. Immer weiß einer etwas besser als der andere und keiner hat den mum nachgeben. Hauptsache deine Frage wurde beantwortet

0
Tuxgamer2  23.06.2017, 22:28
@Takiry

@Takiry

Im Zweifelsfall alles ignorieren, was wir da schreiben ;).

1

1. cron läuft als Superuser-Job, somit läuft so ein Job bereits mit root-Rechten,  sudo ist dort völlig sinnlos.

2. cd ist "nur" ein in (hier der bash ) der Shell eingebauter Befehl.
sudo cd <anderes Verzeichnis> wird mit einer Fehlermeldung enden, da sudo ein Binary erwartet.
Möglicherweise ist cd auch nur ein Schreibfehler und sollte cp heißen(?).

3. auch wenn Linux Datei-Namen-Erweiterungen nicht benötigt, mit .sh werden zur Wiedererkennung Shell-Scrip-Dateien gekennzeichnet. Warum nennst du das Backup auch so?

4. das Datum im Dateinamen unterzubringen ist relativ einfach. Siehe die Man-Page von date.
Beispiel:

 cp <meine-Datei> <Pfad>/<meine-Datei>.`date +%d%m%Y`

5. Zum Löschen alter Backup-Dateien würde ich einfach in das Datum der Erstellung den Wochentag aufnehmen

 cp <meine-Datei> <Pfad>/<meine-Datei>.`date +%d%m%Y.%u`

Vor dem Anlegen des neuen Backup kann dann das 7 Tage alte mit

rm <Pfad>/<meine-Datei>.*.`date %u` 

gelöscht werden.


Woher ich das weiß:Berufserfahrung – openSuSE seit 1995
Takiry 
Fragesteller
 23.06.2017, 14:45

1. ja da hast du recht. das hier war nur für die frage zusammenkopiert da ich bereits mal ein script angefangen hatte und da hatte ich root gebraucht... ach egal du hast da recht in dem vall wird sudfo nicht gebraucht. War ein Fehler bei der frage auf dem System ist es bei mir richtig.

2. Ja soory auch nur ein schreibfehler. Wäre ja quatsch das Verzeichnis beim kopieren zu wechseln :D

3. ich habe mir das so angewohnt dass ich beim backup alle andungen usw behalte. Es sollen nicht nur .sh datein kopiert werden sondern auch viele andere formate. darum lass ich immer die andung dran. warum ich das oben mal vor und mal nach dem datum schreibe weiß nur der liebe gott xD

4. Danke perfekt

5. das mit %u ist natürlich eine geniale idee... Das erspart viel hin und her gerechne. Danke dafür. Daran habe ich nie gedacht.

Zusammenfassend muss ich sagen das du meine frage sehr genau gelesen hast und jede menge fehler bei mir entdeckt hast. Tja war ich vorhin doch zu schnell beim Fragen. Danke für die ausführliche antwort

0