编辑:我想这篇文章并不是像我认为的那样“不是特别有用”。这是一个非常快速的解决方案,它只跟踪最新修改的文件(而不是对整个文件列表进行排序):
find . -type f -printf '%T@ %p\n' | awk 'BEGIN { mostrecenttime = 0; mostrecentline = "nothing"; } { if ($1 > mostrecenttime) { mostrecenttime = $1; mostrecentline = $0; } } END { print mostrecentline; }' | cut -f2- -d ' '
为了清楚起见,将其分布在多行中,如下所示:
find . -type f -printf '%T@ %p\n' | awk '
BEGIN { mostrecenttime = 0; mostrecentline = "nothing"; }
{
if ($1 > mostrecenttime)
{ mostrecenttime = $1; mostrecentline = $0; }
}
END { print mostrecentline; }' | cut -f2- -d ' '
编辑结束
这不是一个特别有用的帖子,但是由于“安排”是在讨论速度,我想我应该分享一下。
range和enzotib的解决方案包括将目录中的所有文件及其mtime列出,然后进行排序。如您所知,排序并不需要找到最大值。查找最大值可以在线性时间内完成,但排序需要n log(n)个时间[我知道相差不大,但仍然;)]。我想不出一个整齐的实现方法。[编辑:上面提供的一种简洁(尽管看上去很脏)和快速实现。]
第二件事-若要在目录中找到最新编辑的文件,请在每个1级子目录中递归地找到最新编辑的文件。让此文件代表子目录。现在,对1级文件以及1级子目录的代表进行排序。如果每个目录的1级文件和子目录的数量几乎是恒定的,则此过程应与文件总数成线性比例。
这是我想实现此目的的方法:
findrecent() { { find "$1" -maxdepth 1 -type f -exec stat -c "%y %n" {} + | sort -r | head -1 && find "$1" -mindepth 1 -maxdepth 1 -type d -exec findrecent {} \;; } | sort -r | head -1; }
findrecent .
我跑了这个,发现了很多find: findrecent: No such file or directory
错误。原因:-exec的find在另一个shell中运行。我尝试在.bashrc,.xsessionrc中定义findrecent,但这些方法无济于事[感谢您的帮助]。最后我求助于
#!/bin/bash
{ find "$1" -maxdepth 1 -type f -exec stat -c "%y %n" {} + | sort -r | head -1 && find "$1" -mindepth 1 -maxdepth 1 -type d -exec findrecent {} \;; } | sort -r | head -1;
在findrecent
我的PATH中调用的脚本中,然后运行它。
我跑了这个,一直在等待,没有输出。为了确保我没有处理任何无限循环,我将文件修改为
#!/bin/bash
echo "$1" >&2
{ find "$1" -maxdepth 1 -type f -exec stat -c "%y %n" {} + | sort -r | head -1 && find "$1" -mindepth 1 -maxdepth 1 -type d -exec findrecent {} \;; } | sort -r | head -1;
然后再试一次。它确实有效-但是在我的家用文件夹上花费了1分35秒-安排和恩佐替布的解决方案分别花费了1.69和1.95秒!
O(n)优于O(n log(n))的优势!该死的函数调用开销![或者更确切地说,脚本调用的开销]
但是此脚本的扩展性比早期解决方案要好,我敢打赌它在Google的存储库上的运行速度将比它们快;