Pravděpodobně je to možné provést bez vytváření souborů pomocí substituce procesů nebo něčeho podobného, ale zde je rychlé a špinavé řešení:
find . -type f -mtime +30 -printf '%h\n' | sort | uniq > old.txt
find . -type f -mtime -30 -printf '%h\n' | sort | uniq > new.txt
grep -vf new.txt old.txt
První příkaz vypíše cestu každého souboru upraveného před více než 30 dny (v parametru find -printf
-- alespoň s GNU find na mém systému -- %h
vytiskne celou cestu kromě skutečného souboru), pak je seřadí a zbaví se všech duplikátů a celou věc vloží do souboru s názvem old.txt
.
Druhý příkaz provede totéž, ale s každým souborem upraveným před méně než 30 dny a vloží je do jiného souboru, new.txt
.
Řádek grep vytiskne každý řádek z old.txt, který se neobjeví v new.txt -- takže vám poskytne seznam adresářů, které obsahují pouze soubory, které byly naposledy upraveny před více než 30 dny.
To vše pomocí GNU verzí utilit. Nevím, zda se syntaxe shoduje s verzemi BSD atd.
Konečně jsem přišel na tu kouzelnou jednolinku:
for dir in `find . -type d -mtime +30`; do test `find $dir -type f -mtime -30 -print -quit` || echo $dir; done
Tím se vytisknou všechny adresáře, které mají dobu úpravy delší než 30 dní a za posledních 30 dní nebyly změněny žádné soubory.