在“ls”样式输出中列出最近修改的文件,而不在整个目录上运行“ls”?

在“ls”样式输出中列出最近修改的文件,而不在整个目录上运行“ls”?

我有一个包含数万个文件的目录。我想列出最近修改的文件(例如在最后一天内修改的文件或其他)。

以下命令可以工作,但速度很慢,因为它涉及ls文件夹中的每个文件:

ls -rt | tail -n 10

以下命令速度更快,但输出不如以下命令详细ls

find -mtime -1

有没有一种方法可以列出最近修改的文件(设定数量或按日期),具有ls类似的输出但速度更快?

答案1

至少 GNU 和 FreeBSDfind具有该-ls操作,它会产生类似于以下内容的输出ls

$ find . -ls
   392815      4 drwxr-xr-x   2 user  group      4096 Jul 22 18:39 .
   392816      0 -rw-r--r--   1 user  group         0 Jul 22 18:39 ./foo.txt
   392818      0 -rw-r--r--   1 user  group         0 Jul 22 18:39 ./bar.txt

GNU find 还以操作的形式提供非常可配置的输出-printf

也就是说,我确实想知道是什么让你ls这么慢。两者都find需要ls读取整个目录并调用lstat()所有文件来查找日期,因此应该没有太大区别。ls确实需要对整个文件列表进行排序,因此如果文件数量确实很大,那么这可能会产生影响。在这种情况下,您可能需要考虑将文件分散到不同的目录(可能基于文件的日期)。删除-r并使用headnottail可能会有所帮助。

答案2

如果您有可用的 zsh shell,它可以为您执行一些日期过滤和排序:

列出两个最新的文件:

ls -ld -- *(om[1,2])

(添加Dglob 限定符也可以考虑隐藏文件)。

列出两个最旧的文件(从生成列表的末尾向后计数):

ls -ld -- *(om[-2,-1])

或者:

ls -ld -- *(Om[1,2])

列出 5 天前修改的文件:

ls -ld -- *(m+4)

(就像find -mtime +4当年龄四舍五入到天数时严格地大于4)。

列出过去 5 天内修改的文件:

ls -ld -- *(m-5)

这些都是例子“全球预选赛”。 zsh shell 在这里完成所有艰苦的工作;它会提供匹配的文件名(如果有)并将该列表传递给ls它以使其列出。

请注意,如果您想将结果限制为仅纯文件(而不是目录、套接字、管道等),请使用.;例如:

列出清楚的过去 5 天内修改的文件:

ls -ld -- *(.m-5)

相关内容