![在“ls”样式输出中列出最近修改的文件,而不在整个目录上运行“ls”?](https://linux22.com/image/157675/%E5%9C%A8%E2%80%9Cls%E2%80%9D%E6%A0%B7%E5%BC%8F%E8%BE%93%E5%87%BA%E4%B8%AD%E5%88%97%E5%87%BA%E6%9C%80%E8%BF%91%E4%BF%AE%E6%94%B9%E7%9A%84%E6%96%87%E4%BB%B6%EF%BC%8C%E8%80%8C%E4%B8%8D%E5%9C%A8%E6%95%B4%E4%B8%AA%E7%9B%AE%E5%BD%95%E4%B8%8A%E8%BF%90%E8%A1%8C%E2%80%9Cls%E2%80%9D%EF%BC%9F.png)
我有一个包含数万个文件的目录。我想列出最近修改的文件(例如在最后一天内修改的文件或其他)。
以下命令可以工作,但速度很慢,因为它涉及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
并使用head
nottail
可能会有所帮助。
答案2
如果您有可用的 zsh shell,它可以为您执行一些日期过滤和排序:
列出两个最新的文件:
ls -ld -- *(om[1,2])
(添加D
glob 限定符也可以考虑隐藏文件)。
列出两个最旧的文件(从生成列表的末尾向后计数):
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)