cat letzten 5 Dateien in einem Verzeichnis

cat letzten 5 Dateien in einem Verzeichnis

Ich habe ein Verzeichnis mit Dateinamen im Format $date.txt. Ich möchte die 5 neuesten Dateien daraus herausfiltern. Gibt es dafür eine elegantere Lösung als

for f in 2*.txt; do echo $f; done | tail -5 | while read f; do cat $f; done

Antwort1

In ksh93oder :bashzsh

files=( 2*.txt )
cat "${files[@]: -5}"

Dadurch wird ein Array der Dateinamen erstellt, die dem Muster entsprechen 2*.txt. Anschließend wird der Inhalt der letzten fünf davon ausgegeben.

In zshkönnen Sie auch einen Dateibereich als Teil desGlob-Qualifikation:

cat 2*.txt([-5,-1])

In jeder POSIX-Shell kann dies auch erfolgen durch

set -- 2*.txt
while [ "$#" -gt 5 ]; do shift; done   # or: [ "$#" -gt 5 ] && shift "$(( $# - 5 ))"
cat "$@"

Dadurch werden die Positionsparameter auf die Dateinamen gesetzt, die dem Muster entsprechen. Anschließend werden die Namen vom Anfang der Liste verschoben, bis die Liste nur noch fünf Elemente enthält. catwird dann für die verbleibenden Dateinamen aufgerufen.

Bei allen diesen Lösungen würden die Dateien lexikografisch sortiert. Dateinamen mit Leerzeichen oder Zeilenumbrüchen würden korrekt behandelt.

Antwort2

Ich würde eine While-Lese-Schleife verwenden, die Dateien mit Leerzeichen verarbeiten würde.

ls 2*.txt | tail -5 | while read loop
do
  cat "$loop" 
done 

Wenn Sie immer die 5 aktuellsten sehen möchten, können Sie es ändern inls -tr | tail -5

Antwort3

Basierend auf der Frage, ohne Aussicht auf Leerzeichen und 2*.txt, das glücklicherweise die richtige Reihenfolge zurückgibt, wie wäre es mit

cat $(ls 2*.txt|tail -5)

Antwort4

Wie in der Frage erwähnt latest, können wir die Änderungszeit der Dateien im Verzeichnis überprüfen.

 cat $(ls -ltr *.txt | tail -n5 | awk '{print $NF}' | tr '\n' ' ')
  • ls -ltr- listet Dateien hinsichtlich des Änderungszeitstempels auf (umgekehrt)

  • tail -n5- nimmt die letzten 5 Dateien

  • $NF- letztes Feld

  • tr- Spalte in Zeile transponieren

verwandte Informationen