Wie verkette ich alle Dateien in einem bestimmten Verzeichnis in chronologischer Reihenfolge, wobei die neueste Datei ganz oben stehen soll?

Wie verkette ich alle Dateien in einem bestimmten Verzeichnis in chronologischer Reihenfolge, wobei die neueste Datei ganz oben stehen soll?

Und mit der ältesten Datei ganz unten?

Wenn ich das mache, ist es dann auch möglich, die redundanten Header aus jeder HTML-Datei zu entfernen? Ich stelle fest, dass ich viele HTML-Dateien verkette und es wäre schön, die Dateigröße der endgültigen Datei ein wenig zu reduzieren.

Antwort1

Zum Verketten von Dateien verwenden Sie

cat file1 file2 file3 ...

Um eine Liste zitierter Dateinamen nach Zeit sortiert zu erhalten (neueste zuerst), verwenden Sie

ls -t

Alles in allem,

cat $(ls -t) > outputfile

Möglicherweise möchten Sie einige Argumente angeben ls(z. B. *.html).

Dies funktioniert jedoch nicht, wenn Ihre Dateinamen Leerzeichen enthalten. My file.htmlEs wird davon ausgegangen, dass es sich um zwei Dateinamen handelt: Myund file.html. Sie können lsdie Dateinamen in Anführungszeichen setzen und dann verwenden xargs, das die Anführungszeichen versteht, um die Argumente an zu übergeben cat.

ls -tQ | xargs cat

Was Ihre zweite Frage betrifft, ist das Herausfiltern von Teilen von Dateien nicht schwierig, es hängt jedoch davon ab, was genau Sie entfernen möchten. Was sind die „redundanten Header“?

Antwort2

Der einfachste Weg, Dateien in einer anderen als der lexikografischen Reihenfolge aufzulisten, ist mit zshGlob-Qualifikation. Ohne zsh können Sie verwenden ls, aberDas Parsen der Ausgabe lsist mit Gefahren verbunden.

cat *(om)

Wenn Sie einige Zeilen entfernen möchten, verwenden Sie sed, awk oder perl. So können Sie beispielsweise die <head>aus der ersten Datei nehmen und die <body>Teile aus den anderen Dateien kombinieren, vorausgesetzt, dass die Tags <body>und </body>in jeder Datei allein in einer Zeile stehen:

{
  sed -e '/<\/body>/ q' *.html(om[2])
  sed -e '1,/<body>/ d' -e '/<\/body>/,$ d' *.html(om[3,-1])
  echo '</body>'
  echo '</html>'
} >concatenated.html

Erläuterung:

  • Zuerst concatenated.htmlwird erstellt. Es ist daher die jüngste *.htmlDatei (vorausgesetzt, keine Datei hat ein Datum in der Zukunft).
  • Kopieren Sie dann aus der zweitjüngsten *.htmlDatei, brechen Sie jedoch an dieser </body>Zeile ab.
  • Kopieren Sie dann aus den anderen Dateien, überspringen Sie jedoch alles bis zur <body>Zeile und beginnen Sie mit der </body>Zeile.
  • Erstellen Sie abschließend die letzten schließenden Tags.

Antwort3

Die von @angus bereitgestellte Lösung ist gut, wird aber Probleme verursachen, wenn sich im Ordner Verzeichnisse befinden. Das Problem wird durch diese Lösung behoben.

cat $(ls -tpa | grep -v / )

verwandte Informationen