2015-12-22 08:16:28 -0500, Greg Wooledge: [...] > t=946702800 # Start at Sat Jan 1 12:00:00 EST 2000 > endyear=2036 > > while true; do > printf -v year '%(%Y)T' "$t" > ((year > endyear)) && break > printf -v day '%(%d)T' "$t" > printf -v dow '%(%w)T' "$t" > if [[ $day = 13 && $dow = 5 ]]; then > printf -v month '%(%m)T' "$t" > echo "$year-$month-$day" > fi > ((t += 86400)) > done > > But just because it doesn't fork, doesn't mean it's *fast*. Bash is so > slow at everything. :( Your one-fork-per-month loop (plus one fork per > year) might end up being much faster than my zero-forks-per-day loop. > Mine is portable, though. [...]
(assumes a recent version of bash though). Starting on a Friday and looping with ((t += 7*86400)) and look for %d == 13 would be more efficient. TZ=UTC0 perl -MPOSIX -le 'for ($i=86400;$i<2**31;$i+=7*86400) { @t=gmtime($i); if ($t[3] == 13){print strftime"%c",@t}}' only takes a few miliseconds here. -- Stephane