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

ls -altR . | head -n 3

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


当前回答

如果在每个文件上单独运行stat会变慢,你可以使用xargs来加快速度:

find . -type f -print0 | xargs -0 stat -f "%m %N" | sort -n | tail -1 | cut -f2- -d" " 

其他回答

我也遇到过同样的问题。我需要递归地找到最近的文件。花了大约50分钟才找到。

这里有一个小脚本来更快地完成它:

#!/bin/sh

CURRENT_DIR='.'

zob () {
    FILE=$(ls -Art1 ${CURRENT_DIR} | tail -n 1)
    if [ ! -f ${FILE} ]; then
        CURRENT_DIR="${CURRENT_DIR}/${FILE}"
        zob
    fi
    echo $FILE
    exit
}
zob

它是一个递归函数,获取目录中最近修改的项。如果该项是一个目录,则递归调用该函数并搜索该目录,等等。

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

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。

我为这个问题写了一个pypi/github包,因为我也需要一个解决方案。

https://github.com/bucknerns/logtail

安装:

pip install logtail

用法:尾部更改文件

logtail <log dir> [<glob match: default=*.log>]

用法2:在编辑器中打开最近更改的文件

editlatest <log dir> [<glob match: default=*.log>]

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

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