#!/usr/bin/c++script progdesc ("Find files modified lately in a directory"); option recurse ('r',"recurse","Inspect sub-directory",false,false); option nbresult('n',"nbresult","Number of files shown",10,false); int ret = -1; if (args.size()==0){ usage(); }else{ ret = 0; for (auto &d:args){ // Multiple files may share the same modification time // So we create a unique key combining the timespec of a file and an entry number // timespec has nanosecond resolution, so two files are unlikely to have the // same timespec, but using the entry number, we insure key uniqueness. struct TIME_ENTRY{ struct timespec modified; unsigned num; // Entry number TIME_ENTRY(const struct timespec &_m, unsigned _n):modified(_m),num(_n){} bool operator < (const TIME_ENTRY &n) const{ return tie(modified.tv_sec,modified.tv_nsec,num) < tie (n.modified.tv_sec,n.modified.tv_nsec,n.num); } }; map results; unsigned file_num=0; vector dirs; dirs.push_back(d); while (dirs.size() > 0){ DIRNAME dir(dirs[0]); dirs.erase(dirs.begin()); for (auto &&st:dir.ls() | DIRNAME::drop_dot_dirs() | DIRNAME::stat()){ string fullname = format("{}/{}",st.dirname,st.name); if (st.is_dir()){ if (recurse.val) dirs.emplace_back(move(fullname)); }else{ results[TIME_ENTRY(st.modified,file_num)] = fullname; if (results.size() > nbresult.val) results.erase(results.begin()); file_num++; } } } if (args.size() > 1) cout << format ("Directory {}\n",d); for (auto &e:results){ cout << format ("{} {}\n",e.first.modified,e.second); } } } return ret;