如何只列出每个目录的最后一行?

如何只列出每个目录的最后一行?

谢谢你,我学会了如何仅显示列表的最后一行,例如

ls -ltr | sed '$!d'

现在我想,如何将它与 find 命令结合起来,以便在每个目录中重复此操作,但我只得到了一个错误的解决方案:

find / -type d | xargs ls -ltr | sed '$!d'

如果我没看错的话,这不会显示每个目录的最后一行,而只会显示所有目录的所有列表的最后一行。

怎样做才正确呢?

答案1

我会使用这种构造作为起点

find / -type d -print0 | xargs -0 -I'{}' sh -c 'ls -ltr {} | tail -1'

警告:它不喜欢空目录(total 0是输出)。

答案2

也许这会更好:find 和 shell 的组合

find / -type d -print0 | while read -r -d '' dir; do 
    ls -ltr "$dir" | sed '$!d'
done

find将输出找到的每个目录,使用空字节而不是换行符来分隔它们。该流被送入while循环,用于read -d ''提取每个以空分隔的目录名称。然后,对于每个目录,除了最后一行之外的所有ls输出都会被 删除sed

关键是循环while遍历每个目录名称,因此可以为每个目录找到最新的文件。

这样做的一个大问题是ls -l输出不会显示目录名称,因此输出可能没有多大意义——您看到文件但不知道它们出现在哪个目录中。

要查找每个目录中的最新文件,我会这样做:

find . -type f -printf "%h:%T@:%p\n" |
sort -t: -k1,1r -k2,2nr |
awk -F: '!seen[$1]++ {print $3}'
  • find获取目录、修改时间和路径名
  • sort按目录分组并按时间排序
  • awk打印每个目录的第一个路径名

相关内容