
У меня есть каталог с именами файлов в формате $date.txt. Я хотел бы получить из него 5 последних файлов. Есть ли более элегантное решение, чем
for f in 2*.txt; do echo $f; done | tail -5 | while read f; do cat $f; done
решение1
В ksh93
, bash
или zsh
:
files=( 2*.txt )
cat "${files[@]: -5}"
Это создаст массив имен файлов, соответствующих шаблону 2*.txt
. Затем он выведет содержимое последних пяти из них.
В zsh
, вы также можете указать диапазон файлов как часть егоквалификаторы glob:
cat 2*.txt([-5,-1])
В любой оболочке POSIX это также можно сделать через
set -- 2*.txt
while [ "$#" -gt 5 ]; do shift; done # or: [ "$#" -gt 5 ] && shift "$(( $# - 5 ))"
cat "$@"
Это устанавливает позиционные параметры для имен файлов, соответствующих шаблону. Затем он сдвигает имена с начала списка до тех пор, пока в списке не останется только пять элементов. cat
затем вызывается для оставшихся имен файлов.
Во всех этих решениях файлы будут отсортированы лексикографически. Имена файлов с пробелами или символами новой строки обрабатываются правильно.
решение2
Я бы использовал цикл while read, он бы обрабатывал файлы с пробелами.
ls 2*.txt | tail -5 | while read loop
do
cat "$loop"
done
Если вы всегда хотите видеть 5 последних, вы можете изменить это наls -tr | tail -5
решение3
Исходя из вопроса, без перспективы пробелов и 2*.txt, успешно возвращающих правильный порядок, как насчет
cat $(ls 2*.txt|tail -5)
решение4
Как уже упоминалось latest
в вопросе, мы можем проверить время модификации файлов в каталоге.
cat $(ls -ltr *.txt | tail -n5 | awk '{print $NF}' | tr '\n' ' ')
ls -ltr
- выведет список файлов с учетом метки времени изменения (в обратном порядке)tail -n5
- возьмет последние 5 файлов$NF
- последнее полеtr
- транспонировать столбец в строку