由于工作原因,要管理一些图片服务器,其中有几台是作为图片存放的机器,每台机器配有10T的硬盘,最近硬盘告急,都只剩下几百个G,所以要删除一些图片。

目前服务器有一亿多个文件,删过这种大量的小碎文件的朋友一定知道使用rm -rf的下场,效果非常的差,基本上看不到什么效果。通过find命令带delete的效果也不太好,后来使用了rsync将空目录同步过去的方式,效果比较好,一天大概能清理出400G的空间。

为了保证并发的效果,写了脚本充当守护进程

 

 
  
  1. #!/bin/sh 
  2. #./delete.sh get_dir_path_cmd rsync_delete_cmd_process_total_count 
  3. #./delete.sh "find /data1/sinawapcms/htdocs/p_w_picpaths/iask/2012/08/*  -maxdepth 0"   20    
  4.  
  5. rsync_path=rsync 
  6. empty_dir=/tmp/empty/ 
  7.  
  8. get_rsync_process_num() 
  9.  
  10.     echo  $(ps -ef | grep rsync | grep delete | wc -l); 
  11.  
  12. #$1 is rsync cmd , $2 is rsync total process num 
  13. do_rsync_cmd() 
  14.     while test 1 = 1  
  15.     do 
  16.         if test  $(get_rsync_process_num) -lt $2  
  17.         then 
  18.             ($1 >/dev/null 2>&1 &); 
  19.             break; 
  20.         else 
  21.             sleep 100; 
  22.         fi  
  23.     done  
  24.      
  25. if ! ( $rsync_path --version > /dev/null 2>&1 )  
  26. then 
  27.     echo rsync path error; 
  28.     exit 1;  
  29. fi 
  30.  
  31. if ! ls -l $empty_dir  > /dev/null 2>&1 
  32. then 
  33.     if ! mkdir -p $empty_dir >/dev/null 2>&1 
  34.     then 
  35.         echo Permission Denied, make sure you have permission to mkdir -p /tmp/empty ;     
  36.         exit 3; 
  37.     fi 
  38. fi 
  39.  
  40. if ! test $( ls -la $empty_dir | wc -l) = 3 
  41. then 
  42.     echo  Directoty \"$empty_dir\" is not empty, empty directory? ; 
  43.  
  44.     printf "Enter (Y/N):"
  45.     read action < /dev/tty; 
  46.  
  47.     if test $action = "Y" || test $action = 'y' 
  48.     then 
  49.         if ! rm -rf ${empth_dir}/* >/dev/null 2>&1  
  50.         then 
  51.             echo Permission Denied, make sure you have permission to rm -rf $empty_dir; 
  52.             exit 3; 
  53.         fi  
  54.     else 
  55.         echo error, Directoty \"$empty_dir\" is not empty; 
  56.         exit 2; 
  57.     fi  
  58.  
  59. fi 
  60.  
  61.  
  62. dir=$($1); 
  63. #rsync --delete-before -a -H  /tmp/empty/   /data1/sinawapcms/htdocs/p_w_picpaths/iask/2012/08/ff/  >/dev/null & 
  64. for i in $dir 
  65. do 
  66.     sleep 5; 
  67.     cmd="$rsync_path --delete-before -a -H $empty_dir ${i}/" ; 
  68.     (do_rsync_cmd "$cmd" $2); 
  69. done 

调用方式:

./delete.sh "find /data1/sinawapcms/htdocs/p_w_picpaths/iask/2012/08/*  -maxdepth 0"   20  第一个参数用来获取我们要清空的目录 第二个参数限定并发数,防止服务器负载过高