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,bashzsh:

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

这将创建一个与模式匹配的文件名数组2*.txt。然后它会输出最后五个的内容。

zsh,您还可以指定一系列文件作为其一部分全局限定符:

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

在任何 POSIX shell 中,这也可以通过

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- 将列转置为行

相关内容