Bash: neuste Datei finden...

Du suchst ein Programm für einen bestimmten Zweck?
Antworten
Benutzeravatar
Turkey1976
Beiträge: 79
Registriert: 14.01.2008 01:19:31
Wohnort: Aachen
Kontaktdaten:

Bash: neuste Datei finden...

Beitrag von Turkey1976 » 23.08.2020 13:43:15

Liebe Freunde,

ich betreibe eine Moodle-Lernplattform und dort fällen täglich Backups an.

Jetzt habe ich ein Verzeichnis mit rund 1500 Backupdateien der Lernräume.

Code: Alles auswählen

 sicherung-moodle2-course-397-09_wp_wl_con-20200809-0301.mbz
 sicherung-moodle2-course-397-09_wp_wl_con-20200810-0301.mbz
 sicherung-moodle2-course-397-09_wp_wl_con-20200811-0301.mbz
 sicherung-moodle2-course-397-09_wp_wl_con-20200812-0301.mbz
 sicherung-moodle2-course-397-09_wp_wl_con-20200813-0300.mbz
 sicherung-moodle2-course-399-8a_ph_ls-20200725-0306.mbz
 sicherung-moodle2-course-399-8a_ph_ls-20200726-0304.mbz
 sicherung-moodle2-course-399-8a_ph_ls-20200727-0304.mbz
 sicherung-moodle2-course-399-8a_ph_ls-20200728-0305.mbz
 sicherung-moodle2-course-399-8a_ph_ls-20200729-0303.mbz
Wir haben hier exemplarisch je 5 Backups von 2 Lernräumen. Die jeweils jüngsten Sicherungen der Lernräume haben NICHT zwingen das gleiche Erstellungsdatum. Ich möchte jeweils das jüngste Backup eines jeden Lernraums in ein anderes Verzeichnis kopieren. Wie geht das?

Benutzeravatar
Lord_Carlos
Beiträge: 5578
Registriert: 30.04.2006 17:58:52
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Dänemark

Re: Bash: neuste Datei finden...

Beitrag von Lord_Carlos » 23.08.2020 13:54:57

ls -Art *course-397* | tail -n 1
ls -Art *course-399* | tail -n 1

Wuerde das hier funktionieren?
Kannst das ganze auch in ein script packen, wo man erst die Kurse in ein array packt, dann mit einer schleife alle Kurse durchgehen.

Oder brauchst du eine Loesung die den Dateinamen parsed?

Code: Alles auswählen

╔═╗┬ ┬┌─┐┌┬┐┌─┐┌┬┐╔╦╗
╚═╗└┬┘└─┐ │ ├┤ │││ ║║
╚═╝ ┴ └─┘ ┴ └─┘┴ ┴═╩╝ rockt das Forum!

Benutzeravatar
Turkey1976
Beiträge: 79
Registriert: 14.01.2008 01:19:31
Wohnort: Aachen
Kontaktdaten:

Re: Bash: neuste Datei finden...

Beitrag von Turkey1976 » 23.08.2020 16:46:50

Da ich 500 Kurse habe, müsste ich ja 500x den Befehl ausführen, dass bringt so leider nichts.

Benutzeravatar
Lord_Carlos
Beiträge: 5578
Registriert: 30.04.2006 17:58:52
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Dänemark

Re: Bash: neuste Datei finden...

Beitrag von Lord_Carlos » 23.08.2020 16:58:16

Wenn die alle von 1 nach 500 benannt sind kannst du doch ne schleife nehmen.

Code: Alles auswählen

╔═╗┬ ┬┌─┐┌┬┐┌─┐┌┬┐╔╦╗
╚═╗└┬┘└─┐ │ ├┤ │││ ║║
╚═╝ ┴ └─┘ ┴ └─┘┴ ┴═╩╝ rockt das Forum!

Benutzeravatar
Turkey1976
Beiträge: 79
Registriert: 14.01.2008 01:19:31
Wohnort: Aachen
Kontaktdaten:

Re: Bash: neuste Datei finden...

Beitrag von Turkey1976 » 23.08.2020 17:00:45

In der Nummerierung gibt es Lücken... Sieht man sogar im Beispiel...

JTH
Moderator
Beiträge: 3077
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Bash: neuste Datei finden...

Beitrag von JTH » 23.08.2020 17:29:36

Turkey1976 hat geschrieben: ↑ zum Beitrag ↑
23.08.2020 17:00:45
In der Nummerierung gibt es Lücken... Sieht man sogar im Beispiel...
Ja und? Wenn es zu einer Nummer keine existierende Datei gibt, wird die Nummer in einer Schleife halt übersprungen. Absolut kein Problem.

Lord_Carlos hat dir einen allgemeinen Ansatz vorgeschlagenen, wie man aus einer Liste Dateien nach bestimmtem Namensschema jeweils die neueste heraussuchen kann. Reicht dir das nicht, um es an deine Zwecke anzupassen? Dann solltest du nochmal genauer beschreiben, wie sich die Dateinamen zusammensetzen und welcher Part genau den Raum beschreibt (course-XYZ? wp_wl_con und ph_ls?).

Die Wünsche und Anforderungen des Fragenden erraten ist im Forum nicht immer die beliebteste Disziplin.
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
Turkey1976
Beiträge: 79
Registriert: 14.01.2008 01:19:31
Wohnort: Aachen
Kontaktdaten:

Re: Bash: neuste Datei finden...

Beitrag von Turkey1976 » 23.08.2020 17:34:11

Ich werde mal sehen, ob ich mit den Informationen ein brauchbares Script gebastelt bekomme. Ich melde mich an dieser Stelle zurück.

Korodny
Beiträge: 722
Registriert: 09.09.2014 18:33:22
Lizenz eigener Beiträge: GNU Free Documentation License

Re: Bash: neuste Datei finden...

Beitrag von Korodny » 23.08.2020 18:05:43

Was ist denn an Lord_Carlos' Vorschlag falsch? Die Parameter "A" und "r" braucht's m.E. nicht, aber

Code: Alles auswählen

ls -t *course-397* | tail -n 1
Sollte die neueste Datei (und nur die) mit diesem Dateinamen liefern, damit füttert man dann cp - fertig. Das war doch das zu lösende Problem?

Benutzeravatar
whisper
Beiträge: 3379
Registriert: 23.09.2002 14:32:21
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: Bash: neuste Datei finden...

Beitrag von whisper » 23.08.2020 18:44:16

Korodny hat geschrieben: ↑ zum Beitrag ↑
23.08.2020 18:05:43
Was ist denn an Lord_Carlos' Vorschlag falsch? Die Parameter "A" und "r" braucht's m.E. nicht, aber

Code: Alles auswählen

ls -t *course-397* | tail -n 1
Sollte die neueste Datei (und nur die) mit diesem Dateinamen liefern, damit füttert man dann cp - fertig. Das war doch das zu lösende Problem?
Nee, das r == reverse ist wichtig, es sortiert so, dass die neueste Datei unten ist.
Da danach tail kommt ist dies richtig.
Oder ohne, dann mit head :-)
Alter ist übrigens keine Ausrede, nur Erfahrung, die sich stapelt. 😉

Benutzeravatar
Meillo
Moderator
Beiträge: 9242
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Bash: neuste Datei finden...

Beitrag von Meillo » 23.08.2020 18:50:59

Wenn man `-r' verwendet muss man `tail' nehmen fuer die neuesten Eintraege. Wenn man `-r' weglaesst, muss man stattdessen `head' nehmen. Zweiteres wuerde ich empfehlen, weil bei grossen Verzeichnissen dann weniger Daten durch die Pipe geschaufelt werden muessen.


Zum eigentlichen Problem, hier mal ein paar Brocken:

Code: Alles auswählen

# liste alle Raumkennungen
rooms=`ls sicherung-moodle2-course-*.mbz | sed 's/-20.*-.*.mbz//' | uniq`

# Neueste finden
for i in $rooms ; do
	ls -t $i-*.mbz | head -1
done

# Aeltere loeschen
for i in $rooms ; do
	echo rm `ls -t $i-*.mbz | sed 1d`  # "echo" for dry-run
done
(Ungetesteter Code)


Besser waere es, separate Unterverzeichnisse fuer jeden Raum anzulegen.

Vor allem aber solltest du mit Debianlogrotate arbeiten. Das kann genau das was du willst. Du brauchst dann nur noch eine kleine Konfigurationsdatei schreiben.
Use ed once in a while!

Korodny
Beiträge: 722
Registriert: 09.09.2014 18:33:22
Lizenz eigener Beiträge: GNU Free Documentation License

Re: Bash: neuste Datei finden...

Beitrag von Korodny » 23.08.2020 21:33:19

whisper hat geschrieben: ↑ zum Beitrag ↑
23.08.2020 18:44:16
Nee, das r == reverse ist wichtig, es sortiert so, dass die neueste Datei unten ist.
Autsch, natürlich - sorry, blöder Flüchtigkeitsfehler.

tobo
Beiträge: 2374
Registriert: 10.12.2008 10:51:41

Re: Bash: neuste Datei finden...

Beitrag von tobo » 23.08.2020 22:46:31

Ob du die Daten mit head oder tail filterst, hängt davon ab, wie du die Daten vorher sortierst (soviel ist klar). Ich bin der Meinung, dass du - anders als bisher gezeigt - per Name sortieren solltest. Wenn das Erstellungsdatum im Dateinamen einzigartig und unterscheidbar ist, dann hast du Fehlerquellen durch z.B. Zwischensicherungen/Umkopieren ausgeschlossen. Wenn die Dateinamen "durchdacht" angelegt sind, dann ist das auch das Kriterium, nicht der Dateistempel: ls "$i"-*.mbz | tail -1 bzw. ls "$i"-*.mbz | sort | tail -1 bezogen auf z.B. Meillos Beispiel zum Finden.

Benutzeravatar
Meillo
Moderator
Beiträge: 9242
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Bash: neuste Datei finden...

Beitrag von Meillo » 24.08.2020 06:59:05

tobo hat geschrieben: ↑ zum Beitrag ↑
23.08.2020 22:46:31
Ich bin der Meinung, dass du - anders als bisher gezeigt - per Name sortieren solltest. Wenn das Erstellungsdatum im Dateinamen einzigartig und unterscheidbar ist, dann hast du Fehlerquellen durch z.B. Zwischensicherungen/Umkopieren ausgeschlossen. Wenn die Dateinamen "durchdacht" angelegt sind, dann ist das auch das Kriterium, nicht der Dateistempel: ls "$i"-*.mbz | tail -1 bzw. ls "$i"-*.mbz | sort | tail -1 bezogen auf z.B. Meillos Beispiel zum Finden.
Ja, da ist was dran. Bei passenden Dateinamen ist das vermutlich robuster.
Use ed once in a while!

Benutzeravatar
Turkey1976
Beiträge: 79
Registriert: 14.01.2008 01:19:31
Wohnort: Aachen
Kontaktdaten:

Re: Bash: neuste Datei finden...

Beitrag von Turkey1976 » 09.09.2020 13:59:40

Danke für eure Hilfe, es funktioniert sehr gut!

Antworten