Die folgende erfordert GNU find
und sort
, sondern arbeitet mit allen möglichen Dateinamen (einschließlich den Namen mit Zeilenumbrüchen) und auf Verzeichnisse, in denen die Anzahl der Dateien mit dem angegebenen Präfix beginnen paßt nicht in ARG_MAX
:
#!/usr/bin/env bash
files=()
counter=32
while IFS= read -r -d ' ' timestamp &&
IFS= read -r -d '' filename &&
((--counter >= 0)); do
files+=("$filename")
done < <(find "$dir" -type f -printf '%[email protected] %p\0' | sort -zgr)
declare -p files ## print the generated array of filenames
Mit -printf '%[email protected] %p\0'
wird jedes Ergebnis mit dem UNIX-Zeitstempel (Sekunden seit der Epoche) gedruckt; ein Leerzeichen; der Dateiname; und dann ein NUL.
sort -z
teilt sort
mit, dass NULs (die im Gegensatz zu Newlines in Dateinamen nicht existieren können) zum Abgrenzen von Eingabe- und Ausgabesätzen verwendet werden.
IFS= read -r -d ' ' timestamp && IFS= read -r -d '' filename
liest Inhalt bis zum Platz in einem gegebenen Datensatz in die Variable timestamp
, und liest alles bis zum nächsten NUL in die Variable filename
.
Eine Erläuterung zum Sortieren oder Vergleichen von Dateien basierend auf Metadaten und Why you shouldn't parse the output of ls(1) finden Sie unter BashFAQ #3.
Für die menschliche Überprüfung oder skripted Verwendung? 'ls-t' ist das Richtige für den eigenen Gebrauch; es ist nicht das Richtige für ein Skript. –
Plug für 'zsh', das für diese Art von Aufgabe besser geeignet ist:' print -l filestring * (om [1,50]) '. – chepner