![如何递归列出特定目录中最后修改的文件](https://linux22.com/image/1129959/%E5%A6%82%E4%BD%95%E9%80%92%E5%BD%92%E5%88%97%E5%87%BA%E7%89%B9%E5%AE%9A%E7%9B%AE%E5%BD%95%E4%B8%AD%E6%9C%80%E5%90%8E%E4%BF%AE%E6%94%B9%E7%9A%84%E6%96%87%E4%BB%B6.png)
这可能是一个通用的 Linux 问题,但我会在这里尝试一下。
我经常需要最近修改的文件列表,目前,我使用今天或某个小时的参数将输出ls
传输到管道,但我需要频繁更改参数以获取更新的列表,这有点没有效率。grep
grep
是否有一个简单的命令来列出某个路径上最后修改的文件?
答案1
要从某个目录中递归查找最后 5 个修改的文件,请从该目录运行:
find . -type f -printf '%T@ %p\n' | sort -k1,1nr | head -5
%T@
使用-printf
谓词find
将获取文件自纪元以来的修改时间,%p
将打印文件名sort -k1,1nr
将sort
根据纪元时间对结果进行数字反转head -5
将获得最后修改的五个文件名
如果您只想在当前目录中搜索(而不是递归),请使用stat
:
stat -c '%Y %n' * | sort -k1,1nr | head -5
或者find
:
find . -maxdepth 1 -type f -printf '%T@ %p\n' | sort -k1,1nr | head -5
检查man find
并man stat
获得更多想法。
答案2
其实很简单。要获取当前目录中的最新文件:
ls -Art | tail -n 2
要获取另一个目录中的最新文件,例如 /opt/spark/ :
ls /opt/spark/ -Art | tail -n 1
这是我在我的集群上使用它的时候:
aa23916@picard03:/opt/spark/applicationHistory$ ls -Art | tail -n 2
app-20180124162809-0004
app-20180124163207-0005.inprogress
簡單又容易:)
答案3
下面的脚本递归列出目录中所有在任意时间之前编辑的文件。此外,它还显示自上次编辑以来的时间跨度。
它可以与以下命令一起使用:
findrecent <directory> <time(in hours)>
如下所示:
在此示例中,列出了我的桌面上所有在 36 小时以内编辑的文件。
剧本
#!/usr/bin/env python3
import os
import time
import sys
directory = sys.argv[1]
try:
t = int(sys.argv[2])
except IndexError:
t = 1
currtime = time.time(); t = t*3600
def calc_time(minutes):
# create neatly displayed time
if minutes < 60:
return "[edited "+str(minutes)+" minutes ago]"
else:
hrs = int(minutes/60); minutes = int(minutes - hrs*60)
return "[edited "+str(hrs)+" hours and "+str(minutes)+" minutes ago]"
for root, dirs, files in os.walk(directory):
for file in files:
file = os.path.join(root, file); ftime = os.path.getctime(file)
edited = currtime - ftime
if edited < t:
print(file, calc_time(int(edited/60)))
如何使用
- 如果目录尚不存在,则创建该目录
~/bin
- 将上述脚本复制到一个空文件中,并将其保存
findrecent
为~/bin
- 使脚本可执行
- 退出并重新登录即可完成
笔记
- 如果没有给出时间,脚本将列出过去一小时内编辑的所有文件
- 如果目录包含空格,请使用引号,如示例所示