我有一个文件名格式为 $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
,您还可以指定一系列文件作为其一部分全局限定符:
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
- 将列转置为行