Programmierpraktikum SoSe 2024, Bachelor Informatik, FU Berlin
ProPra2024 > Sprachen > Pythonpraxis > mlh-lsnew

My Little Helpers: lsnew, list youngest files only

Experience
Product

Ziel

  • Ich habe einige Teile der Python-Standardbibliothek für ein echtes Problem gefunden und eingesetzt.
  • Ich habe mir ein Hilfsprogramm gebaut, um mein Gedächtnis auffrischen zu helfen.

Hintergrund

Wenn man an mehreren Dateien arbeitet, verliert man leicht aus dem Blick, was man schon alles angefasst hat (und was nicht). Um sich darüber Klarheit zu verschaffen, wäre manchmal ein Programm nützlich, dass die jüngst bearbeiteten Dateien anzeigt, jüngste zuerst.

Eine solche Auflistung kann das Standardkommando ls erzeugen, aber dabei kommt u.U. eine überwältigend umfangreiche Auflistung heraus. Wir bauen uns hier ein Hilfsprogramm, das für diesen Zweck maßgeschneidert ist.

Loose

Arbeitsschritte

Anforderungen

  • Unser Programm empfängt eine Liste von Dateinamen, die typischerweise bequem von der Shell mittels Globbing erzeugt wird.
    Beispiel: python mlh lsnew *.md mlh/*, mlh/*/*
  • Zu jedem dieser Dateinamen wird das Datum der letzten Änderung der Datei ermittelt, genannt mtime.
  • Die Dateinamen werden nach diesen Zeitpunkten sortiert, jüngste zuerst.
  • Von der entstehenden Liste werden nur diejenigen Dateinamen ausgegeben, für die die Datei jünger ist als 48 Stunden.
  • Dieser Zeitraum lässt sich mit der Option --age ändern; --age 48h ist der Standardwert.
  • Angaben können in Tagen, Stunden, Minuten oder Sekunden erfolgen: 2d, 48h, 100m, 45s. Brechen Sie bei falsch geformten Angaben mit einer hilfreichen Fehlermeldung ab.
  • Neben dem Dateinamen wird auch der Zeitstempel der letzten Änderung mit ausgegeben.
  • Wenn eine Datei nicht existiert oder nicht zugreifbar ist, wird der Name stillschweigend ignoriert.
  • Die Ausgabe hat folgendes Format:
1
2
3
4
5
$ python mlh lsnew --age 1h * mlh/* mlh/*/* nonsense
2024-01-31 10:16:07  mlh/subcmds/__pycache__
2024-01-31 10:16:06  mlh/subcmds
2024-01-31 10:16:06  mlh/subcmds/lsnew.py
2024-01-31 09:20:38  argparse_subcommand.txt

Programmieren

  • Arbeiten Sie für diese Aufgabe an mlh/mlh/subcmds/lsnew.py weiter.
  • Die Aufgabe lässt sich sehr gut komplett mit der Standardbibliothek lösen; Sie brauchen keine zusätzlichen Pakete.
  • Effizienz ist nicht besonders beachtenswert. Der teuerste Schritt ist die Abfrage des Änderungsdatums. Solange Sie das nur einmal pro Dateiname machen, ist Ihr Programm effizient genug.
  • Ein ungefähr funktionaler Programmierstil eignet sich deshalb gut.
  • Organisieren Sie Ihre Implementierung so, dass jedes Unterprogramm nicht mehr als 20 Zeilen umfasst und die Funktion jedes Unterprogramms klar und verständlich ist.
Warnung:

Aufpassen mit den Zeitzonen!

Hinweis (nur bei Bedarf): Wie fragt man die mtime einer Datei ab?

Siehe os.stat in der Python-Standardbibliothek.

Hinweis (nur bei Bedarf): Wie rechnet man eine mtime auf Datum und Uhrzeit um?

Siehe Modul datetime in der Python-Standardbibliothek.

Hinweis (nur bei Bedarf): Wie rechnet man eine mtime auf Datum und Uhrzeit um? (2)

fromtimestamp()

Ausprobieren

Führen Sie zum Testen insbesondere folgende Kommandos aus:

  • 1 python mlh lsnew --age 365000d *.md
  • 2 touch file2; sleep 5; touch file1; sleep 5; touch file3; python mlh lsnew --age 2s file?; echo; python mlh lsnew --age 7s file?; echo; python mlh lsnew --age 1m nonsense file?; rm file{1,2,3}
Trace

Abgabe

Geben Sie ein Kommandoprotokoll ab, das genau nur die Eingaben und Ausgaben der obigen Kommandos 1, 2, … enthält. Entfernen Sie vor Abgabe eventuelle Fehlversuche und sonstige zusätzliche Kommandos aus dem Protokoll.