yesterday 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. #!/bin/rc
  2. rfork e
  3. slashnhack=yes
  4. smon='s/Jan/01/
  5. s/Feb/02/
  6. s/Mar/03/
  7. s/Apr/04/
  8. s/May/05/
  9. s/Jun/06/
  10. s/Jul/07/
  11. s/Aug/08/
  12. s/Sep/09/
  13. s/Oct/10/
  14. s/Nov/11/
  15. s/Dec/12/'
  16. fn usage {
  17. echo 'usage: yesterday [-abcCdDN] [-[[[yy]yy]mm]dd] [-n daysago] file ...' >[1=2]
  18. exit 'usage'
  19. }
  20. fn Xcp {
  21. echo cp $1 $2
  22. cp $1 $2
  23. }
  24. fn Xdiff {
  25. echo diff $1 $2
  26. diff $1 $2
  27. }
  28. fn Xdiffn {
  29. echo diff -n $1 $2
  30. diff -n $1 $2
  31. }
  32. fn Xadiff {
  33. echo /acme/bin/adiff $1 $2
  34. /acme/bin/adiff $1 $2
  35. }
  36. fn Xcarefulcp {
  37. if(! cmp -s $1 $2) Xcp $1 $2
  38. }
  39. fn Xecho {
  40. echo $1
  41. }
  42. fn Xbind {
  43. echo bind $1 $2
  44. bind $1 $2
  45. }
  46. year=`{date|sed 's/.* //'}
  47. copy=Xecho
  48. last=()
  49. while(! ~ $#* 0 && ~ $1 -* && ! ~ $1 --){
  50. switch($1){
  51. case -a
  52. copy=Xadiff
  53. shift
  54. case -b
  55. copy=Xbind
  56. shift
  57. case -c
  58. copy=Xcp
  59. shift
  60. case -d
  61. copy=Xdiff
  62. shift
  63. case -D
  64. copy=Xdiffn
  65. shift
  66. case -C
  67. copy=Xcarefulcp
  68. shift
  69. # The slashnhack is always right.
  70. # case -N
  71. # slashnhack=no
  72. # shift
  73. case -n*
  74. if(~ $1 -n){
  75. if(~ $#* 1)
  76. usage
  77. shift
  78. days=$1
  79. }
  80. if not
  81. days=`{echo $1 | sed 's/^-.//'}
  82. last=`{date `{hoc -e `{date -n} ^ '-'$days'*60*60*24'} | \
  83. sed -e 's%... (...) (..) ..:..:.. ... (....)%\3/\1\2%' -e 'y/ /0/' -e $smon}
  84. shift
  85. case -?
  86. mon=`{date|sed -e 's/^....(...).*/\1/' -e $smon}
  87. last=$year/$mon ^`{echo $1|sed 's/^-/0/'}
  88. shift
  89. case -??
  90. mon=`{date|sed -e 's/^....(...).*/\1/' -e $smon}
  91. last=$year/$mon ^`{echo $1|sed 's/^-//'}
  92. shift
  93. case -????
  94. last=$year/ ^ `{echo $1|sed 's/^-//'}
  95. shift
  96. case -??????
  97. last=`{echo $year|sed 's/..$//'} ^ `{echo $1|sed 's/^-(..)/\1\//'}
  98. shift
  99. case -????????
  100. last=`{echo $1|sed 's/^-(....)/\1\//'}
  101. shift
  102. case *
  103. usage
  104. }
  105. }
  106. if(! ~ $#* 0 && ~ $1 --)
  107. shift
  108. if(~ $#* 0)
  109. usage
  110. dir=`{pwd}
  111. if(! ~ $status ''){
  112. echo 'yesterday: can''t find directory' >[1=2]
  113. exit 'pwd failed'
  114. }
  115. for(i){
  116. xpath=`{cleanname -d $dir -- $i}
  117. xdump=dump
  118. dumppath=$xpath
  119. if(~ $slashnhack yes && ~ $xpath /n/*/*){
  120. xdump=`{echo $xpath | sed 's:/n/([^/]+)/.*:\1dump:'}
  121. dumppath=`{echo $xpath | sed 's:/n/[^/]+(/.*):\1:'}
  122. }
  123. if(! test -e /n/$xdump/$year)
  124. 9fs $xdump
  125. if(~ $#last 0)
  126. xlast=`{ls -t /n/$xdump/$year|sed 1q}
  127. if not
  128. xlast=/n/$xdump/$last
  129. if(! test -e $xlast){
  130. echo 'yesterday:' \
  131. `{echo $xlast|sed 's/.n.dump.(....).(..)(..)/\1 \2 \3/'} \
  132. 'is not a backup day for' $xdump >[1=2]
  133. exit 'bad date'
  134. }
  135. $copy $xlast^$dumppath $xpath
  136. }
  137. exit ''