home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume39 / trm / part01 next >
Text File  |  1993-08-29  |  16KB  |  509 lines

  1. Newsgroups: comp.sources.misc
  2. From: tpaquette@ita.lgc.com (Trevor Paquette)
  3. Subject: v39i059:  trm - rm replacement, does remove and recover, Part01/01
  4. Message-ID: <1993Aug29.164417.24371@sparky.sterling.com>
  5. X-Md4-Signature: 7dd49b82c5de9e96d2581c0e3c64cf5e
  6. Sender: kent@sparky.sterling.com (Kent Landfield)
  7. Reply-To: tpaquette@ita.lgc.com
  8. Organization: Landmark/ITA
  9. Date: Sun, 29 Aug 1993 16:44:17 GMT
  10. Approved: kent@sparky.sterling.com
  11.  
  12. Submitted-by: tpaquette@ita.lgc.com (Trevor Paquette)
  13. Posting-number: Volume 39, Issue 59
  14. Archive-name: trm/part01
  15. Environment: UNIX
  16.  
  17. I wrote the following after accidently deleting some files that I did not
  18. want to delete.. Hope someone else finds it as useful as I have.
  19.  
  20. Trevor's rm. Version 1.04
  21.  
  22. It's 'rm' but more... It can handle removing directories.. recovering
  23. 'removed' files and undoing the last 'remove'.. read on..
  24.  
  25. Don't forget to chmod 755 this file after installing it.
  26.  
  27. trm file [file..]
  28.     will MOVE the named files to the $TRMTMP directory
  29.     If the file being moved already has a version under $TRMTMP then
  30.     the version number is incremented and the file is moved.
  31.         EX: trm gm.c      gm.c is currently not in TRMTMP)
  32.                           TRMTMP would now contail a file called gm.c,01
  33.                            This is the first version of gm.c under TRMTMP
  34.               
  35.             trm gm.c      there already is a 'gm.c' under TRMTMP. This
  36.                           file would be moved to gm.c,02. It is the second
  37.                           version of gm.c
  38.  
  39. trm  -list | -l  [file..]
  40.     will list the named files that are in the $TRMTMP directory
  41.       This will list all the versions of the named files.
  42.       If no file is given then the entire contents of TRMTMP are listed
  43.  
  44. trm  -recover | -rc  file [file..]
  45.     will recover the biggest version of the named files from the
  46.     $TRMTMP directory to `pwd`
  47.         EX: trm -rc gm.c     There is are two versions of gm.c in TRMTMP.
  48.                              gm.c,01 and gm.c,02. trm will grab gm.c,02
  49.                              and recover it as gm.c
  50.  
  51. trm  -undo | -un
  52.     will undo the last rm
  53.         meaning you accidently removed a bunch of files and instead of
  54.         listing them one by one and recovering each.. this will do all of
  55.         them for you in one shot..
  56.         NOTE: THIS WILL NOT AUTOMAGICALLY PUT THE FILES BACK FROM WHENCE
  57.               THEY CAME. IT WILL PUT THE FILES TO `pwd`
  58.  
  59. trm  -listundo | -lun
  60.     will list the undo files
  61.  
  62. trm  -purge | -p  [file..]
  63.     will REMOVE ALL VERSIONS of the named files that are in the
  64.       $TRMTMP directory
  65.     [no files named will remove the $TRMTMP directory completly and then
  66.      remake it]
  67. ---------
  68. #! /bin/sh
  69. # This is a shell archive.  Remove anything before this line, then feed it
  70. # into a shell via "sh file" or similar.  To overwrite existing files,
  71. # type "sh file -c".
  72. # Contents:  trm
  73. # Wrapped by kent@sparky on Sun Aug 29 11:38:40 1993
  74. PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
  75. echo If this archive is complete, you will see the following message:
  76. echo '          "shar: End of archive 1 (of 1)."'
  77. if test -f 'trm' -a "${1}" != "-c" ; then 
  78.   echo shar: Will not clobber existing file \"'trm'\"
  79. else
  80.   echo shar: Extracting \"'trm'\" \(11745 characters\)
  81.   sed "s/^X//" >'trm' <<'END_OF_FILE'
  82. X#!/bin/sh
  83. X#
  84. X# Trevor's rm. Version 1.04
  85. X# 
  86. X#  It's 'rm' but more... It can handle removeing directories.. recovering
  87. X#  'removed' files and undoing the last 'remove'.. read on..
  88. X#
  89. X#  dont't forget to chmod 755 this file after installing it
  90. X#
  91. X#  trm file [file..]
  92. X#    will MOVE the named files to the $TRMTMP directory
  93. X#    If the file being moved already has a version under $TRMTMP then
  94. X#    the version number is incremented and the file is moved.
  95. X#        EX: trm gm.c      gm.c is currently not in TRMTMP)
  96. X#                          TRMTMP would now contail a file called gm.c,01
  97. X#                           This is the first version of gm.c under TRMTMP
  98. X#              
  99. X#            trm gm.c      there already is a 'gm.c' under TRMTMP. This
  100. X#               file would be moved to gm.c,02. It is the second
  101. X#                          version of gm.c
  102. X#
  103. X#  trm  -list | -l  [file..]
  104. X#    will list the named files that are in the $TRMTMP directory
  105. X#      This will list all the versions of the named files.
  106. X#      If no file is given then the entire contents of TRMTMP are listed
  107. X#
  108. X#  trm  -recover | -rc  file [file..]
  109. X#    will recover the biggest version of the named files from the
  110. X#    $TRMTMP directory to `pwd`
  111. X#        EX: trm -rc gm.c     There is are two versions of gm.c in TRMTMP.
  112. X#                  gm.c,01 and gm.c,02. trm will grab gm.c,02
  113. X#                  and recover it as gm.c
  114. X#
  115. X#  trm  -undo | -un
  116. X#    will undo the last rm
  117. X#     meaning you accidently removed a bunch of files and instead of
  118. X#        listing them one by one and recovering each.. this will do all of
  119. X#        them for you in one shot..
  120. X#        NOTE: THIS WILL NOT AUTOMAGICALLY PUT THE FILES BACK FROM WHENCE
  121. X#              THEY CAME. IT WILL PUT THE FILES TO `pwd`
  122. X#
  123. X#  trm  -listundo | -lun
  124. X#    will list the undo files
  125. X#
  126. X#  trm  -purge | -p  [file..]
  127. X#    will REMOVE ALL VERSIONS of the named files that are in the
  128. X#      $TRMTMP directory
  129. X#    [no files named will remove the $TRMTMP directory completly and then
  130. X#     remake it]
  131. X#
  132. X# ---------------------------------------------------------------------------
  133. X# Version 1.04  Aug 26 1993
  134. X#
  135. X# Bug Fix. when removeing a dir that already exists it would try to use the last
  136. X#   entry in the dir as the version number.. bad. Use ls -1d, not ls -1
  137. X#
  138. X# Version 1.03  Aug  25 1993
  139. X#
  140. X#  Add version information.
  141. X#    Thanx to montanaro@ausable.crd.ge.com (Skip Montanaro) for this.
  142. X#    Removing a dir/file that already exists in $TRMTMP, will cause it
  143. X#    to be set to the next 'version' of that file. Recovering a file/dir
  144. X#    will grab the biggest version.
  145. X#  Add basename $0 for getting the program name
  146. X#
  147. X# Version 1.02  Aug  25 1993
  148. X#
  149. X#  Add short form options
  150. X#  Bug Fix. enclose TRMDEBUG in quotes wherever needed
  151. X#
  152. X# Version 1.01  Aug  23 1993
  153. X#
  154. X#   - add TRMDEBUG to set -x and -v for debugging
  155. X#   - add -purge option
  156. X#   - add check for moving a file ontop of existing one (ONLY if moved failed)
  157. X#
  158. X# Version 1.00  July 22 1993
  159. X#
  160. X#  Initial release
  161. X#
  162. X# ===========================================================================
  163. X#  How to Setup
  164. X# ===========================================================================
  165. X# I put the following in my .cshrc to create the trmlast and trmtmp
  166. X# variables for each shell, only if interactive
  167. X
  168. X# if ( $?prompt ) then 
  169. X#   # create trm variables
  170. X#   # NOTE: TRMLOCK is created in the .login
  171. X#   setenv TRMLAST $HOME/.trmtmp/.trmlast.`hostname`.$$
  172. X#   setenv TRMTMP  $HOME/.trmtmp
  173. X# fi
  174. X
  175. X# You may also want to put the following remove, recover and listing
  176. X# aliases in your .cshrc
  177. X
  178. X# alias    rm    'echo "Use trm instead"'
  179. X# alias    rc    'trm -recover \!*'
  180. X# alias    prc    'trm -purge \!*'
  181. X# alias    lsrc    'trm -list \!* | more'
  182. X# alias rcu    'trm -undo'
  183. X# alias    lsrcu    'trm -listundo | more'
  184. X
  185. X# ---------------------------------------------------------------------------
  186. X# I also put the following in my .login
  187. X
  188. X# # create recover directory.
  189. X# # Only the process on the machine that created the directory should be able
  190. X# # to remove it
  191. X# # NOTE: $TRMTMP and $TRMLAST are created in the .cshrc
  192. X# setenv TRMLOCK $HOME/.trmlock.`hostname`.$$
  193. X
  194. X# if !( -d $TRMTMP ) then
  195. X#    mkdir $TRMTMP
  196. X#    chmod 700 $TRMTMP
  197. X#    echo "$TRMTMP created at `date`. Lockfile is $TRMLOCK" > $TRMLOCK
  198. X# fi
  199. X
  200. X# ---------------------------------------------------------------------------
  201. X# I also put the following in my .logout
  202. X
  203. X# if ( -f $TRMLOCK ) then
  204. X#   /bin/rm -rf $TRMTMP
  205. X#   /bin/rm -f $TRMLOCK
  206. X# fi
  207. X
  208. X# ===========================================================================
  209. X# start of trm
  210. X# ===========================================================================
  211. X
  212. X# get program name
  213. Xprog=`basename $0`
  214. X
  215. X# setenv TRMDEBUG to 1 to display verbose debugging info
  216. Xif [ "$TRMDEBUG" = "1" ]; then
  217. X   set -x
  218. X   set -v
  219. Xfi
  220. X
  221. X# if $TRMTMP is not set then look under $home/.trmtmp
  222. Xif [ "$TRMTMP" = "" ]; then
  223. X   TRMTMP=$HOME/.trmtmp
  224. Xfi
  225. X
  226. X# make sure $TRMTMP is a directory
  227. Xif [ ! -d $TRMTMP ]; then
  228. X   echo $prog: ERROR: $TRMTMP is not a directory or does not exist
  229. X   exit 1
  230. Xfi
  231. X
  232. X# if no arguments passed then return
  233. Xif [ $# -eq 0 ]; then
  234. X  exit 0
  235. Xfi
  236. X
  237. X# ---------------------------------------------------------------------------
  238. X# handle listing
  239. X# ---------------------------------------------------------------------------
  240. Xif [ "$1" = "-list" -o "$1" = "-l" ]; then
  241. X
  242. X   # shift out -list from the arg list
  243. X   shift
  244. X
  245. X   # if no futher args then list the directory
  246. X   if [ $# -eq 0 ]; then
  247. X     ls -laug $TRMTMP
  248. X     exit 0
  249. X   fi
  250. X
  251. X   # cd to the directory and list each argument individually
  252. X   cd $TRMTMP
  253. X   for i in $*; do
  254. X     ls -laug $i,*
  255. X   done
  256. X
  257. X   exit 0
  258. Xfi
  259. X
  260. X# ---------------------------------------------------------------------------
  261. X# handle recover
  262. X# ---------------------------------------------------------------------------
  263. Xif [ "$1" = "-recover"  -o "$1" = "-rc" ]; then
  264. X
  265. X   # shift out -recover from the arg list
  266. X   shift
  267. X
  268. X   # if no futher args then exit
  269. X   if [ $# -eq 0 ]; then
  270. X     exit 0
  271. X   fi
  272. X
  273. X   # the destination directory is where you are now
  274. X   destdir=`pwd`
  275. X
  276. X   # cd to the TRMTMP directory
  277. X   cd $TRMTMP
  278. X
  279. X   # for each arg passed try to 'mv' it to the destination dir
  280. X   for i in $*; do
  281. X
  282. X     # get back the biggest version
  283. X     rev=`(ls -1d $TRMTMP/$i,* 2>/dev/null) |\
  284. X        sort |\
  285. X        tail -1 |\
  286. X        sed -e 's/.*,\([0-9]*\)/\1/'`
  287. X     
  288. X     /bin/mv -f $i,$rev $destdir/$i > /dev/null 2>&1
  289. X
  290. X     if [ $? != 0 ]; then
  291. X       # the move failed... 
  292. X
  293. X      # probably tried to remove a file that already exists in $TRMTMP
  294. X      if [ -d $destdir/$i ]; then
  295. X    echo $prog: ${i} already exists in $destdir as a dir, move if needed.
  296. X      elif [ -f $destdir/$i ]; then
  297. X        echo $prog: ${i} already exists in $destdir as a file, move if needed.
  298. X      elif [ -d $i ]; then
  299. X         # tried to move a directory.. most likely failure is trying to move
  300. X         # a directory across filesystems.. sooo lets tar up the whole thing
  301. X         # and then untar it in the destination directory
  302. X         tar -cBf - $i,$rev | ( cd $destdir ; tar -xBpf - )
  303. X     mv $destdir/$i,$rev $destdir/$i
  304. X
  305. X     # now remove the directory from $TRMTMP
  306. X         /bin/rm -rf $i,$rev
  307. X
  308. X       fi
  309. X     fi
  310. X   done
  311. X   exit 0
  312. Xfi
  313. X
  314. X# ---------------------------------------------------------------------------
  315. X# handle undo
  316. X# ---------------------------------------------------------------------------
  317. Xif [ "$1" = "-undo" -o "$1" = "-un" ]; then
  318. X
  319. X   # the destination directory is where you are now
  320. X   destdir=`pwd`
  321. X
  322. X   # cd to the TRMTMP directory
  323. X   cd $TRMTMP
  324. X
  325. X   # if $TRMLAST is not set then we have nothing to do
  326. X   if [ "$TRMLAST" = "" ]; then
  327. X     exit 0
  328. X   fi
  329. X
  330. X   # if $TRMLAST does not exist then we have nothing to do
  331. X   if [ ! -f $TRMLAST ]; then
  332. X     exit 0
  333. X   fi
  334. X
  335. X   # foreach file in the $TRMLAST list try to 'mv' it to the destination dir
  336. X   for i in `cat $TRMLAST`; do
  337. X
  338. X     # get back the biggest version
  339. X     rev=`(ls -1d $TRMTMP/$i,* 2>/dev/null) |\
  340. X        sort |\
  341. X        tail -1 |\
  342. X        sed -e 's/.*,\([0-9]*\)/\1/'`
  343. X     
  344. X     /bin/mv -f $i,$rev $destdir/$i > /dev/null 2>&1
  345. X
  346. X     if [ $? != 0 ]; then
  347. X       # the move failed... 
  348. X
  349. X      # probably tried to remove a file that already exists in $TRMTMP
  350. X      if [ -d $destdir/$i ]; then
  351. X    echo $prog: ${i} already exists in $destdir as a dir, move if needed.
  352. X      elif [ -f $destdir/$i ]; then
  353. X        echo $prog: ${i} already exists in $destdir as a file, move if needed.
  354. X      elif [ -d $i ]; then
  355. X         # tried to move a directory.. most likely failure is trying to move
  356. X         # a directory across filesystems.. sooo lets tar up the whole thing
  357. X         # and then untar it in the destination directory
  358. X         tar -cBf - $i,$rev | ( cd $destdir ; tar -xBpf - )
  359. X     mv $destdir/$i,$rev $destdir/$i
  360. X
  361. X     # now remove the directory from $TRMTMP
  362. X         /bin/rm -rf $i,$rev
  363. X
  364. X       fi
  365. X     fi
  366. X   done
  367. X
  368. X   # at this point we want to reset the $TRMLAST file list
  369. X   /bin/rm -f $TRMLAST
  370. X   echo > $TRMLAST
  371. X
  372. X   exit 0
  373. Xfi
  374. X
  375. X# ---------------------------------------------------------------------------
  376. X# handle listundo
  377. X# ---------------------------------------------------------------------------
  378. Xif [ "$1" = "-listundo" -o "$1" = "-lun" ]; then
  379. X
  380. X   # if $TRMLAST is not set then we have nothing to do
  381. X   if [ "$TRMLAST" = "" ]; then
  382. X     exit 0
  383. X   fi
  384. X
  385. X   # if $TRMLAST does not exist then we have nothing to do
  386. X   if [ ! -f $TRMLAST ]; then
  387. X     exit 0
  388. X   fi
  389. X
  390. X   # cat the $TRMLAST file
  391. X   cat $TRMLAST
  392. X
  393. X   exit 0
  394. Xfi
  395. X
  396. X# ---------------------------------------------------------------------------
  397. X# handle purge
  398. X# ---------------------------------------------------------------------------
  399. Xif [ "$1" = "-purge" -o "$1" = "-p" ]; then
  400. X
  401. X   # shift out -purge from the arg list
  402. X   shift
  403. X
  404. X   # if no futher args then remove $TRMTMP and remake it
  405. X   if [ $# -eq 0 ]; then
  406. X     /bin/rm -rf $TRMTMP
  407. X     mkdir $TRMTMP
  408. X     exit 0
  409. X   fi
  410. X
  411. X   # cd to the directory and remove each argument individually
  412. X   cd $TRMTMP
  413. X   for i in $*; do
  414. X     /bin/rm -rf $i,*
  415. X   done
  416. X
  417. X   exit 0
  418. Xfi
  419. X
  420. X# ---------------------------------------------------------------------------
  421. X# handle remove
  422. X# ---------------------------------------------------------------------------
  423. X
  424. X# at this point we want to reset the old $TRMLAST file list
  425. X if [ "$TRMLAST" != "" ]; then
  426. X   /bin/rm -f $TRMLAST
  427. X fi
  428. X
  429. Xfor i in $*; do
  430. X
  431. X  # if the filename passed does not exist then echo what 'rm' would  
  432. X  # for now only deal with files and dirs..
  433. X  if [  ! -f $i  -a  ! -d $i  ]; then
  434. X     echo $prog: ${i}: No such file or directory
  435. X  else
  436. X    # figure out a version number to move the file to
  437. X    rev=`(ls -1d $TRMTMP/$i,* 2>/dev/null) |\
  438. X        sort |\
  439. X        tail -1 |\
  440. X        sed -e 's/.*,\([0-9]*\)/\1/'`
  441. X    if [ "$rev" = "" ] ; then
  442. X       rev=1;
  443. X    else
  444. X       rev=`expr $rev + 1`
  445. X    fi
  446. X    if [ "$rev" = "" ]; then
  447. X      rev=01
  448. X    fi
  449. X    rev=`echo $rev | awk '{if(length($1)==1){print 0$1}else{print $1}}'`
  450. X    if [ $rev -gt 99 ]; then
  451. X      echo $prog: ${i} already has 99 versions, staying at 99
  452. X      rev=99
  453. X    fi
  454. X
  455. X    # try to move the file to $TRMTMP
  456. X    /bin/mv -f $i $TRMTMP/$i,$rev > /dev/null 2>&1
  457. X
  458. X    if [ $? != 0 ]; then
  459. X      # the move failed
  460. X
  461. X      # probably tried to remove a file that already exists in $TRMTMP
  462. X      if [ -d $i ]; then
  463. X        # tried to move a directory.. most likely failure is trying to move
  464. X        # a directory across filesystems.. sooo lets tar up the whole thing
  465. X        # and then untar it in the $TRMTMP directory
  466. X        tar -cBf - $i | ( cd $TRMTMP ; tar -xBf - ) > /dev/null 2>&1
  467. X    mv $TRMTMP/$i $TRMTMP/$i,$rev
  468. X
  469. X        # now remove the directory
  470. X        /bin/rm -rf $i
  471. X      fi
  472. X
  473. X    fi
  474. X
  475. X    # at this point the 'remove' was succesfull. Add the filename to the
  476. X    # $TRMLAST file for possible undoing.
  477. X    if [ "$TRMLAST" != "" ]; then
  478. X      echo $i >> $TRMLAST
  479. X    fi
  480. X
  481. X  fi
  482. X
  483. Xdone
  484. X
  485. END_OF_FILE
  486.   if test 11745 -ne `wc -c <'trm'`; then
  487.     echo shar: \"'trm'\" unpacked with wrong size!
  488.   fi
  489.   chmod +x 'trm'
  490.   # end of 'trm'
  491. fi
  492. echo shar: End of archive 1 \(of 1\).
  493. cp /dev/null ark1isdone
  494. MISSING=""
  495. for I in 1 ; do
  496.     if test ! -f ark${I}isdone ; then
  497.     MISSING="${MISSING} ${I}"
  498.     fi
  499. done
  500. if test "${MISSING}" = "" ; then
  501.     echo You have the archive.
  502.     rm -f ark[1-9]isdone
  503. else
  504.     echo You still must unpack the following archives:
  505.     echo "        " ${MISSING}
  506. fi
  507. exit 0
  508. exit 0 # Just in case...
  509.