我们平时都是在linux服务器上工作,有时候工作要处理很大的文件(源码,数据文件,exe),而服务器只给我很小的home空间,我就只能把文件放到/tmp目录下。然而服务器管理员会用脚本定时清理那些长时间没有访问的文件(大概一两天左右),身边经常有同事这一周好不容易弄来一堆文件,休息一个周末回来就发现已经没有了,于是鄙人写了个脚本用来自动刷新文件夹下所有文件时间戳的脚本

使用方法: nohup keepAlive 1.5&  #运行keepAlive,在未来的1.5天内刷新文件夹下所有文件的时间戳

基本原理就是靠touch命令刷新文件时间戳,脚本真正蛋疼之处是靠shell计算浮点数,由于shell自带的计算只能精确到整数,只能靠awk来帮忙了……

文件:keepAlive

 
  
  1. #!/bin/sh 
  2. #Usage : run script under certain directory, to keep files under this directory fresh 
  3. #Example: nohup keepAlive 1.5& 
  4. #Note: directory should have permission to write files under current directory 
  5.  
  6. #Visit given directory recursively and use touch command to update the timestamp of all files in it 
  7. function freshDir() { 
  8.     for file in `ls $1` 
  9.     do 
  10.         touch $1"/"$file 
  11.         if [ -d $1"/"$file ] 
  12.         then 
  13.             freshDir $1"/"$file 
  14.         fi 
  15.     done 
  16.  
  17. #Show help when script started without arguments 
  18. function showHelp() { 
  19.     echo "Run script under certain directory, to keep files under this directory up to date and not be deleted" 
  20.     echo "Example: nohup ~yantang/tools/keepAlive 1.5&" 
  21.     echo "Then all files under current directory will be refreshed in the next 1.5 days " 
  22.     echo "Kill it manually when you no longer need it" 
  23.  
  24. if [ $# -gt 0 ] 
  25. then 
  26.     daysAlive=$1 
  27. else 
  28.     showHelp 
  29.     exit 
  30. fi 
  31.  
  32. curDate=`date
  33. echo "The time now: $curDate" 
  34. echo "The directory will be alive for $daysAlive days" 
  35.  
  36. startTime=`date +%s` 
  37. currentTime=$startTime 
  38. typeset days=$(echo ${currentTime} ${startTime}|awk '{print ($1-$2)/86400 }'
  39.  
  40. isAlive=1 
  41.  
  42. while [ $isAlive -gt 0 ] 
  43. do 
  44.     freshDir "." 
  45.     sleep 600    #Sleep 10 minutes 
  46.     currentTime=`date +%s` 
  47.     days=$(echo ${currentTime} ${startTime} | awk '{print ($1-$2)/86400 }'
  48.     isAlive=$(echo ${days} ${daysAlive}|awk '{if($1<$2) print 1; else print 0;}'
  49. done 
  50.  
  51. curDate=`date
  52. echo "Now the time is $curDate .keepAlive stopped running. Bye"