Inkrementelles Anwenden einer generischen Transformation auf einen Satz von Dateien

Nehmen wir an, ich habe einen Build-Prozess, bei dem einer der Schritte darin besteht, eine Transformation auf eine Reihe von Dateien anzuwenden, sodass eine Quelldatei einer Zieldatei entspricht. Dies kann so etwas wie Komprimierung, Verschlüsselung, Bildskalierung usw. sein.

Da es sehr lange dauert, dies jedes Mal für alle Quelldateien zu tun, möchte ich es inkrementell tun, sodass eine Datei nur verarbeitet wird, wenn sie neuer ist als die entsprechende Zieldatei.

Es scheint mir, dass dies ein sehr allgemeiner Prozess und eine sehr allgemeine Bedingung ist, also frage ich mich, ob es ein vorhandenes Tool gibt, das sich um diesen Teil des Prozesses kümmern kann? Ich muss also nur einen Befehl selbst implementieren, der eine Eingabe- und Ausgabedatei als Parameter verwendet (oder stdin/out verwendet) - falls es noch nicht existiert.

Linux- und/oder Windows-Lösungen willkommen. Optionale Bonusfunktionen:

  • Eine einzelne Quelldatei führt zu mehreren Zieldateien (z. B. Skalieren eines Bildes auf mehrere Größen)
  • Mehrere Quelldateien führen zu weniger Zieldateien (z. B. Bündel von Dateien zusammen archivieren)
  • Basieren der "konvertieren oder nicht"-Entscheidung auf einem Hash statt auf dem Änderungsdatum (zuverlässiger). Dies würde erfordern, dass der Transformer das Speichern des Quell-Hashs in der Zieldatei und das Lesen unterstützt.

Ist das vielleicht etwas, makedas tun kann?

Antworten (2)

Sie können make, scons, ant usw. verwenden, die alle im Grunde eine Regel der Form annehmen:

Zieldatei hängt von Eingabe(n) ab

und eine Operation:

Ziel erstellen durch Ausführen von Schritt(en)

Das Build-Tool untersucht alle Beziehungen und führt den Build durch, einschließlich der Fälle, in denen die Ausgabedatei eines Prozesses eine der Abhängigkeiten von einem oder mehreren der anderen ist, und erstellt nur die Ziele korrekt neu, deren Vorfahren sich geändert haben.

makearbeitet ausschließlich mit Zeitstempeln. sconsverwendet eine Kombination aus Zeitstempeln, Größen und MD5s, um zu überprüfen, was geändert wurde.

NB Softwareentwickler verwenden diese Tools seit Jahren, aber es gibt keinen Grund, warum sie nicht auf eine Verarbeitung angewendet werden können, vorausgesetzt, dies kann über die Befehlszeile oder per Skript erfolgen . Mehrere Tools versuchen sogar, parallel zu verarbeiten. Wenn also a -> A und b -> B, aber A + B -> C, kann die Transformation der ersten beiden parallel durchgeführt werden, aber C kann nicht erstellt werden, bis beide fertig sind.

Verwenden Sie Python. Ich verstehe Ihr Dilemma jedoch nicht: Sie überprüfen den Zeitstempel Ihrer Dateien[1] und den Ordnerinhalt, Sie überprüfen, ob eine _001.zip-Datei existiert[2] / oder high_res.jpg existiert und wenn nicht, erstellen Sie sie[3] [4]. Sie wenden beispielsweise unterschiedliche Skalierungsparameter auf ffmpeg und 7zip[5][6] an.

[1] https://stackoverflow.com/a/237084/1889814
[2] https://stackoverflow.com/a/82852/1889814
[3] https://stackoverflow.com/a/24745969/1889814
[4 ] https://stackoverflow.com/a/14569017/1889814
[5] https://trac.ffmpeg.org/wiki/Scaling%20(resizing)%20with%20ffmpeg
[6] https://sevenzip.osdn. jp/chm/cmdline/syntax.htm

Zeitstempel sind nicht wirklich zuverlässig. Verwenden Sie stattdessen einen Hash.
Mein "Dilemma" ist nicht, dass dies besonders schwer ist, ich könnte es wahrscheinlich ziemlich schnell umsetzen. Aber ich möchte dieses Rad nicht immer wieder neu erfinden.