cat последние 5 файлов в каталоге

cat последние 5 файлов в каталоге

У меня есть каталог с именами файлов в формате $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- транспонировать столбец в строку

Связанный контент