在进行递归调用时,ls似乎没有正确地对文件进行排序:
ls -altR . | head -n 3
如何在目录(包括子目录)中找到最近修改的文件?
在进行递归调用时,ls似乎没有正确地对文件进行排序:
ls -altR . | head -n 3
如何在目录(包括子目录)中找到最近修改的文件?
当前回答
你可以使用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。
其他回答
在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。
我费了好大劲才找到Solaris 10下最后一个修改过的文件。find没有printf选项,stat不可用。我发现下面这个方法对我来说很管用:
find . -type f | sed 's/.*/"&"/' | xargs ls -E | awk '{ print $6," ",$7 }' | sort | tail -1
要显示文件名,请使用
find . -type f | sed 's/.*/"&"/' | xargs ls -E | awk '{ print $6," ",$7," ",$9 }' | sort | tail -1
解释
找到。-type f查找并列出所有文件 sed的s /。*/"&"/'将路径名用引号括起来以处理空白 xargs ls -E将带引号的路径发送到ls, -E选项确保返回完整的时间戳(格式为年-月-日小时-分-秒-纳秒) Awk '{print $6," ",$7}'只提取日期和时间 Awk '{print $6," ",$7," ",$9}'提取日期,时间和文件名 Sort返回按日期排序的文件 Tail -1只返回最后修改的文件
查询/target_directory目录下的所有子目录下,在过去60分钟内被修改过的文件。
$ find /target_directory -type f -mmin -60
要查找最近修改的文件,按更新时间的相反顺序排序(即,最近更新的文件在前面):
$ find /etc -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort -r
find . -type f -printf '%T@ %p\n' \
| sort -n | tail -1 | cut -f2- -d" "
对于一棵巨大的树,排序可能很难把所有东西都保存在内存中。
%T@像unix时间戳一样给出修改时间,sort -n按数字排序,tail -1取最后一行(最高时间戳),cut -f2 -d" "从输出中删除第一个字段(时间戳)。
编辑:就像-printf可能只在gnu中使用一样,ajreal中stat -c的使用也是如此。虽然在BSD上也可以做同样的事情,但格式化的选项是不同的(-f "%m %N"似乎是这样)
我错过了复数的部分;如果你想要更多的最新文件,只需要增加tail参数。
这给出了一个排序的列表:
find . -type f -ls 2>/dev/null | sort -M -k8,10 | head -n5
通过在sort命令中添加'-r'来颠倒顺序。如果你只想要文件名,在'| head'之前插入"awk '{print $11}' |"