feat: add recency analysis
Finds the 10 most recently modified files using find with printf and shows human-readable timestamps. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
07d96faf90
commit
ae891357cc
1 changed files with 55 additions and 0 deletions
55
luminos_lib/recency.py
Normal file
55
luminos_lib/recency.py
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
"""Recency analysis — find most recently modified files."""
|
||||
|
||||
import subprocess
|
||||
import os
|
||||
from datetime import datetime
|
||||
|
||||
|
||||
def find_recent_files(target, n=10, show_hidden=False):
|
||||
"""Find the n most recently modified files using find and stat.
|
||||
|
||||
Returns a list of dicts: {path, name, modified, modified_human}.
|
||||
"""
|
||||
# Build find command
|
||||
cmd = ["find", target, "-type", "f"]
|
||||
if not show_hidden:
|
||||
cmd.extend(["-not", "-path", "*/.*"])
|
||||
cmd.extend(["-printf", "%T@\t%p\n"])
|
||||
|
||||
try:
|
||||
result = subprocess.run(
|
||||
cmd, capture_output=True, text=True, timeout=30,
|
||||
)
|
||||
except (subprocess.TimeoutExpired, FileNotFoundError):
|
||||
return []
|
||||
|
||||
if result.returncode != 0:
|
||||
return []
|
||||
|
||||
# Parse and sort by timestamp descending
|
||||
entries = []
|
||||
for line in result.stdout.strip().split("\n"):
|
||||
if not line.strip():
|
||||
continue
|
||||
parts = line.split("\t", 1)
|
||||
if len(parts) != 2:
|
||||
continue
|
||||
try:
|
||||
ts = float(parts[0])
|
||||
except ValueError:
|
||||
continue
|
||||
entries.append((ts, parts[1]))
|
||||
|
||||
entries.sort(key=lambda x: x[0], reverse=True)
|
||||
|
||||
recent = []
|
||||
for ts, path in entries[:n]:
|
||||
dt = datetime.fromtimestamp(ts)
|
||||
recent.append({
|
||||
"path": path,
|
||||
"name": os.path.basename(path),
|
||||
"modified": ts,
|
||||
"modified_human": dt.strftime("%Y-%m-%d %H:%M:%S"),
|
||||
})
|
||||
|
||||
return recent
|
||||
Loading…
Reference in a new issue