在进行递归调用时,ls似乎没有正确地对文件进行排序:

ls -altR . | head -n 3

如何在目录(包括子目录)中找到最近修改的文件?


当前回答

我发现以下内容更简短,输出可解释性更强:

find . -type f -printf '%TF %TT %p\n' | sort | tail -1

给定标准化ISO格式datetimes的固定长度,字典排序就可以了,我们不需要在排序上使用-n选项。

如果你想再次删除时间戳,你可以使用:

find . -type f -printf '%TFT%TT %p\n' | sort | tail -1 | cut -f2- -d' '

其他回答

你可以使用awk只打印修改时间最长的结果(在unix时间下),而不是对结果排序并只保留最后修改的结果:

find . -type f -printf "%T@\0%p\0" | awk '
    {
        if ($0>max) {
            max=$0; 
            getline mostrecent
        } else 
            getline
    } 
    END{print mostrecent}' RS='\0'

如果文件数量足够大,这应该是解决问题的更快方法。

我已经使用了NUL字符(即。'\0'),因为从理论上讲,文件名可以包含任何字符(包括空格和换行符)。

如果你的系统中没有这样病态的文件名,你也可以使用换行符:

find . -type f -printf "%T@\n%p\n" | awk '
    {
        if ($0>max) {
            max=$0; 
            getline mostrecent
        } else 
            getline
    } 
    END{print mostrecent}' RS='\n'

此外,这也适用于mawk。

显示带有人类可读时间戳的最新文件:

find . -type f -printf '%TY-%Tm-%Td %TH:%TM: %Tz %p\n'| sort -n | tail -n1

结果如下所示:

2015-10-06 11:30: +0200 ./foo/bar.txt

若要显示更多文件,请将-n1替换为更高的数字

在Ubuntu 13上,下面的程序可以做到这一点,可能更快一点,因为它颠倒了排序,使用'head'而不是'tail',减少了工作量。使用实例显示树中最新的11个文件。

找到。类型f printf“% T@ % p \ n”排序- n - r | |头-11 | - f2 - - d”“| sed - e ' s ^。/,,' | xargs ls -U -l

这给出了一个完整的ls列表,没有重新排序,并省略了恼人的'。'find'会显示每个文件名。

或者,作为bash函数:

treecent () {
  local numl
  if [[ 0 -eq $# ]] ; then
    numl=11   # Or whatever default you want.
  else
    numl=$1
  fi
  find . -type f -printf '%T@ %p\n' | sort -n -r | head -${numl} |  cut -f2- -d" " | sed -e 's,^\./,,' | xargs ls -U -l
}

尽管如此,大部分工作还是由plundra最初的解决方案完成的。谢谢plundra。

这似乎工作得很好,即使是子目录:

find . -type f | xargs ls -ltr | tail -n 1

如果文件太多,细化查找。

我发现上面的命令很有用,但对于我的情况,我需要查看文件的日期和时间,我有一个问题,几个文件的名称中有空格。 这是我的工作解决方案。

find . -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" " | sed 's/.*/"&"/' | xargs ls -l