
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 ksh93
oder :bash
zsh
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 zsh
kö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. cat
wird 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 Feldtr
- Spalte in Zeile transponieren