在进行递归调用时,ls似乎没有正确地对文件进行排序:
ls -altR . | head -n 3
如何在目录(包括子目录)中找到最近修改的文件?
在进行递归调用时,ls似乎没有正确地对文件进行排序:
ls -altR . | head -n 3
如何在目录(包括子目录)中找到最近修改的文件?
当前回答
查询/target_directory目录下的所有子目录下,在过去60分钟内被修改过的文件。
$ find /target_directory -type f -mmin -60
要查找最近修改的文件,按更新时间的相反顺序排序(即,最近更新的文件在前面):
$ find /etc -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort -r
其他回答
你可以使用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。
查询/target_directory目录下的所有子目录下,在过去60分钟内被修改过的文件。
$ find /target_directory -type f -mmin -60
要查找最近修改的文件,按更新时间的相反顺序排序(即,最近更新的文件在前面):
$ find /etc -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort -r
接着@plundra的回答,下面是BSD和OS X版本:
find . -type f -print0 \
| xargs -0 stat -f "%m %N" \
| sort -rn | head -1 | cut -f2- -d" "
我为这个问题写了一个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>]
我一直在使用类似的东西,以及最近修改的文件的top-k列表。对于大型目录树,避免排序会快得多。如果是最近修改最多的文件:
find . -type f -printf '%T@ %p\n' | perl -ne '@a=split(/\s+/, $_, 2); ($t,$f)=@a if $a[0]>$t; print $f if eof()'
在一个包含170万个文件的目录中,我在3.4秒内获得了最新的一个文件,与使用排序的25.5秒解决方案相比,速度提高了7.5倍。