谢谢你,我学会了如何仅显示列表的最后一行,例如
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
打印每个目录的第一个路径名