Wie verkette ich alle Dateien in einem bestimmten Verzeichnis in der Reihenfolge ihres Datums, in der die neueste Datei oben sein soll?

18

Und mit der ältesten Datei unten?

Ist es in diesem Fall auch möglich, die in jeder HTML-Datei enthaltenen redundanten Header zu entfernen? Ich sehe mich eine Menge HTML-Dateien verketten, und es wäre schön, die Dateigröße der ultimativen Datei ein wenig zu reduzieren.

InquilineKea
quelle

Antworten:

33

Zum Verketten von Dateien, die Sie verwenden

cat file1 file2 file3 ...

Um eine Liste der in Anführungszeichen stehenden Dateinamen zu erhalten, die nach der Zeit sortiert sind (neueste zuerst), verwenden Sie

ls -t

Alles zusammen,

cat $(ls -t) > outputfile

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

Wenn Sie jedoch Dateinamen mit Leerzeichen haben, funktioniert dies nicht. My file.htmlEs werden zwei Dateinamen angenommen: Myund file.html. Sie können lsdie Dateinamen in Anführungszeichen setzen und dann verwenden xargs, wer 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, aber es hängt davon ab, was genau Sie herausfiltern möchten. Was sind die "redundanten Header"?

angus
quelle
Dies funktioniert nicht auf meinem Debian-System ... Ich muss verwenden cat $(ls -t) > outputfile, ansonsten catlehnt die angegebenen Dateinamen ab
Mike Pennington
1
Mein Fehler. Ich werde immer auf diese Dinge gefangen. Siehe aktualisierte Antwort.
Angus
Oh - mit redundanten Headern meine ich Dinge, die normalerweise in einer Datei mit dem Namen header.php / footer.php abgelegt werden, die aber beim Speichern in HTML separat gespeichert werden (und die die Dateigröße beim Massen-Download von PHP-Seiten wirklich erhöhen können).
InquilineKea
cat $(ls -t)ist auch anfällig für Dateinamenerweiterung. Wenn es einen Dateinamen mit einem *oder ?oder einem Klammerausdruck gibt (zB file-[old].html); und wenn der als Muster interpretierte Dateiname mit anderen Dateinamen übereinstimmt; Der Ansatz erzeugt eine falsche Liste. set -fwürde diesen Mangel beheben.
Barefoot IO
ls -Qkann eine Ausgabe erzeugen, die nicht für geeignet ist xargs. Beispiel: "foo"Wird "\"foo\"", aber Xargs versteht keine Anführungszeichen innerhalb von Strings in doppelten Anführungszeichen.
Barefoot IO
2

Der einfachste Weg, Dateien in einer anderen Reihenfolge als der lexikografischen aufzulisten, ist mit zsh glob-Qualifikationsmerkmalen . Ohne zsh können Sie verwenden ls, aber das Parsen der Ausgabe lsist mit Gefahren behaftet .

cat *(om)

Wenn Sie einige Zeilen entfernen möchten, verwenden Sie sed oder awk oder perl. Um beispielsweise die <head>aus der ersten Datei zu nehmen und die <body>Teile aus den anderen Dateien zu kombinieren , gehen Sie davon aus, dass die Tags <body>und </body>in jeder Datei 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:

  • Zunächst 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, beenden Sie jedoch die </body>Zeile.
  • Kopieren Sie dann von den anderen Dateien, aber überspringen Sie alles bis zur <body>Zeile und beginnen Sie mit der </body>Zeile.
  • Produzieren Sie schließlich die letzten schließenden Tags.
Gilles 'SO - hör auf böse zu sein'
quelle
1

Die von @angus gegebene Lösung ist gut, es treten jedoch Probleme auf, wenn sich im Ordner Verzeichnisse befinden, die das Problem beheben.

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

Abdul Rehman Janjua
quelle
Vorsichtsmaßnahme: Diese Antwort ist auch anfällig für die Erweiterung von Pfadnamen, wie in meinem Kommentar zu Angus 'Antwort erläutert.
Barefoot IO
Sofern der Ausgangsstatus der Katze nicht getestet wird, sollte ein Verzeichnisargument keine Rolle spielen. cat sendet einfach eine Nachricht an stderr und fährt mit dem nächsten Argument fort.
Barefoot IO