Vous avez tous déjà été confronté à ce problème, j’en suis certain ! Vous avez un serveur de fichiers où les utilisateurs accumulent un grand nombre de document. Arrive le jour où votre espace de stockage est presque plein ! Vous demandez à vos utilisateurs de faire le ménage et rien ne se passe 😉
D’une certaine façon, c’est assez compréhensible car la tâche qui consiste à ouvrir chaque fichier pour en évaluer l’actualité puis décider de l’archiver et tout simplement colossale.
Pourtant, grâce à des utilitaires comme fileage, il est facile de se rendre compte que beaucoup de fichiers ne servent plus !
On peut alors gagner en peu de temps en activant la compression NTFS sur le disque de stockage – au risque de ralentir le fonctionnement du serveur. L’usage de AutoCompress donne un peu d’intelligence à cette approche puisque seuls les fichiers inutilisés sont compressés.
Arrivera néanmoins le jour où il faudra bien faire du ménage et archiver les données non-utilisées.
J’ai finalement adapté un script écrit en KIXTART pour qu’il parcourt une arborescence et déplace les fichiers anciens vers un répertoire de destination. L’arborescence des répertoires source est recrée dans le répertoire d’archivage.
Un journal est créé pour chaque exécution du script. Ce fichier est ensuite compressé avec 7zip puis envoyé par email grâce à bmail/mpack. Le corps de chaque email contient un récapitulatif des informations du dossier source (taille, nombre de fichiers) et des statistiques sur le nombre de fichiers déplacés.
Les paramètres d’exécution sont définis en début de script.
- $source_dir = “E:Source” – données à archiver
- $dest_dir = “E:Backup” – stockage des données archivées
- $old_threshold=30 – les fichiers n’ayant pas été accédées depuis plus de 30 jours seront archivés
- $debug_mode=”yes” ; – le détail des actions est enregistré
- $simulation_mode =”no” ; – en mode simulation, les fichiers ne sont pas effectivement déplacés
go.bat
kix32.exe du.kix
pause
; NT/95 diskuse + message - Kixtart 3.63, 4.00 ; ; (c) scripting@wanadoo.nl 2001 ; ; vs 1.04 - program ; ; 1.00 (20010525) original version ; 1.01 (20010620) - MBytes notation changed in KBytes ; - contents of "root" wasn't count. ; - cleanup $log_file ; 1.02 (20010701) - fix: no limit to length of variable names ; ($number_of_directories => $number_of_dirs) ; 1.03 (20010710) - standardization of $debug_file value ; 1.04 (20011115) - fix: possible root problem ; (input by Peter Pulfer) ; - suppress SetConsole("hide") ; $prgrm_version="1.04" ; ; --------------------------------------------------------------------------- ; user definable part ; --------------------------------------------------------------------------- $source_dir = "E:Source" ; the directory we want to clean $dest_dir = "E:Backup" ; where to archive old files $old_threshold=30 ; files not used for more than "old_threshold" days are processed $debug_mode="yes" ; - yes/no - no = no user output will be viewed $simulation_mode ="no" ; - yes/no - no = no file will be moved ; --------------------------------------------------------------------------- init_temp_dir() ; init temp var md $dest_dir ; make dest dir if not exist init_debug_file() ; init debug file $number_of_dirs=1 ; init source dir DIM $dirs[$number_of_dirs+1] $dirs[1]=$source_dir ; --------------------------------------------------------------------------- $number_of_files=1 ; <- increase value by new files to check for DIM $files[$number_of_files+1] $files[1]="*.*" $tmp_file=$tmp_directory+"kixtart.tmp" ; init debug mode IF (Exist($debug_file) = 1) del $debug_file ENDIF IF ($debug_mode = "yes") IF (RedirectOutput($debug_file) <> 0) ENDIF ENDIF ? "KIX-DU "+@kix+" (vs "+$prgrm_version+")"+" "+@date+" "+@time ? IF (Exist($tmp_file) = 1) del $tmp_file ENDIF $eof="~~~ The command completed succesfully ~~~" ; $i=1 WHILE ($i <= $number_of_dirs) $k=1 IF (substr($dirs[$i],len($dirs[$i]),1) <> "") $dirs[$i]=$dirs[$i]+"" ENDIF IF ($debug_mode = "yes") ? "check directory: "+$dirs[$i] ENDIF WHILE ($k <= $number_of_files) $entry=$dirs[$i]+$files[$k] IF (exist($dirs[$i]) = 1) SHELL "%comspec% /c echo "+substr($dirs[$i],1,len($dirs[$i])-1)+" >>"+$tmp_file SHELL "%comspec% /c dir "+CHR(34)+$entry+CHR(34)+" /a:d /b /o:n /s >>"+$tmp_file ENDIF $k=$k+1 LOOP $i=$i+1 LOOP SHELL "%comspec% /c echo "+$eof+">>"+$tmp_file ? "check files: "+$files[1] $i=2 WHILE ($i <= $number_of_files) ? " "+$files[$i] $i=$i+1 LOOP ? $total_size=0.0 $total_dirs=0.0 $total_files=0.0 ;---------------------------------------------- $moved_total_size=0.0 $moved_total_files=0.0 ;---------------------------------------------- IF (Exist($tmp_file) = 1) IF (Open(1,$tmp_file,2) = 0) $completed="no" WHILE ($completed <> "yes") $result=LTRIM(RTRIM(Readline(1))) IF (@error <> 0) or (instr($result,$eof) <> 0) $completed="yes" ELSE IF (exist($result) = 1) $total_dirs=$total_dirs+1 GOSUB show_file_info ENDIF ENDIF LOOP IF Close(1) ENDIF ENDIF ENDIF $total_size=$total_size/1024/1024 IF (Exist($tmp_file) = 1) del $tmp_file ENDIF ? IF ($total_dirs+$total_files = 0) ? "completed. found no entries." ELSE ? "completed. found " $total_dirs+$total_files " entries with total size of "+$total_size+" KBytes." ENDIF ? IF (RedirectOutput("") <> 0) ENDIF $moved_total_size=$moved_total_size/1024/1024 ; convert to Mb ; display stats to screen IF ($debug_mode = "yes") ? "Output written to file '"+$debug_file+"'." ? ? " # dirs "+$total_dirs ? " # files "+$total_files ? " # size "+$total_size+" Mbytes" ? " #" IF ($simulation_mode = "yes") ? " # == Simulation mode enabled ==" ? " #" ENDIF ? " # moved files "+$moved_total_files ? " # moved size "+$moved_total_size+" Mbytes" ? " #" ? " # % moved files "+ $moved_total_files*100/$total_files ? " # % moved size "+ $moved_total_size*100/$total_size ? ENDIF ; display stats to logfile i.e email body $log_file="logfile.log" del $log_file /h /c IF Open( 3 , $log_file , 5 ) = 0 $x = WriteLine( 3 , "Output written to file '"+$debug_file+"'."+@CRLF) $x = WriteLine( 3 , @CRLF) $x = WriteLine( 3 , "dirs "+$total_dirs+@CRLF) $x = WriteLine( 3 , "files "+$total_files+@CRLF) $x = WriteLine( 3 , "size "+$total_size+" Mbytes"+@CRLF) $x = WriteLine( 3 , @CRLF) IF ($simulation_mode = "yes") $x = WriteLine( 3 , "== Simulation mode enabled =="+@CRLF) $x = WriteLine( 3 , @CRLF) ENDIF $x = WriteLine( 3 , "moved files "+$moved_total_files+@CRLF) $x = WriteLine( 3 , "moved size "+$moved_total_size+" Mbytes"+@CRLF) $x = WriteLine( 3 , @CRLF) $x = WriteLine( 3 , "% moved files "+ $moved_total_files*100/$total_files+@CRLF) $x = WriteLine( 3 , "% moved size "+ $moved_total_size*100/$total_size+@CRLF) $x = WriteLine( 3 , @CRLF) IF Close(3) Beep ? "Error closing file "+ $log_file+" !" ENDIF Else BEEP ? "Failed to Open "+ $log_file+": [" + @ERROR + "]" ENDIF ; compress logfile with 7z del "logfile1.7z" /h /c $command = "7za u -r -t7z logfile1.7z "+$debug_file+" -mx9 -mmt" ? $command SHELL $command ; create email with $log_file as body and logfile1.7z as attachment $command = "mpack -s purge_ftp_public -d "+$log_file+" -o body.msg logfile1.7z" ? $command SHELL $command ; email result $command = "bmail -d -h -s smtp.monserver.fr -t yyy@@xxx.fr -f zzz@@xxx.fr -m body.msg" ? $command SHELL $command EXIT :show_file_info $count=0 $size=0 IF (substr($result,len($result),1) = "") $result=substr($result,1,len($result)-1) ENDIF $filename=Dir($result+"*.*") WHILE ($filename <> "") AND (@error = 0) IF GetFileAttr($result+""+$filename) & 16 ; - directory - ; -------------------------------------------- md Replace($result+""+$filename, $dirs[1], $dest_dir+"") ; -------------------------------------------- ELSE IF ($filename <> ".") AND ($filename <> "..") $count=$count+1 ENDIF $size=$size+GetFileSize($result+""+$filename) ; --------------------------------------------------------- $last_access_time = GetFileTime($result+""+$filename,2) $old = DateCalc(@date,substr($last_access_time,1,10)) ? $result+""+$filename + " last_write_time="+ $last_write_time + " creation_time="+ $creation_time + " last_access_time="+ $last_access_time + " Last accessed= " + $old+" days ago" $move=""; $move_to=""; if ($old > $old_threshold) $move = " move it to " $move_to = Replace($result+""+$filename, $dirs[1], $dest_dir+"") $moved_total_size= $moved_total_size+GetFileSize($result+""+$filename) $moved_total_files= $moved_total_files+1 IF ($simulation_mode = "no") MOVE $result+""+$filename $move_to /c /h /r ? "moved" else COPY $result+""+$filename $move_to /c /h /r ? "copied " + $result+""+$filename + " to " + $move_to ENDIF endif ; --------------------------------------------------------- ENDIF $filename=Dir() LOOP ; $total_files=$total_files+$count $total_size=$total_size+$size IF ($debug_mode = "yes") ? substr(" ",1,7-len("$count")) $count " " substr(" ",1,9-len("$size")) $size " ==> "+$result ENDIF RETURN ; --------------------------------------------------------- ;FUNCTION DateCalc() ; ;AUTHOR Jochen Polster (jochenDOTpolsterATgmxDOTnet) ; based on date algorithms by Peter Baum to be found here : ; http://www.capecod.net/~pbaum/date/date0.htm ; ;VERSION 1.12 ; ;VERSION HISTORY 1.0 2001/12/10 Initial release ; ; 1.1 2004/02/18 Added support for single digit month/day input ; and optional single digit month/day date return ; ; 1.11 2004/02/20 Minor Variable handling fix ; ; 1.12 2005/03/31 Finally supports "NoVarsInStrings" and "Explicit" set to "ON" in ; all possible variations ; ;ACTION Calculates days between 2 dates or returns a date string calculated from ; a given date and a given amount of days ( Addition of positive or negative ; integer value ) ; ;SYNTAX DateCalc( Date1, Date2|Modifier, [SingleDigit] ) ; ;PARAMETERS Date1 (Required) ; - (Gregorian) Date string in Format : YYYY/M[M]/D[D] ; ; Date2|Modifier (Required) ; - either a second (Gregorian) date string (YYYY/M[M]/D[D]) to calculate days between ; or a positive/negative amount of days to calculate with ; ; SingleDigit (Optional) ; - if not zero date will be returned unpadded, eg. 2004/2/9 ; ;REMARKS Date format must be KiX friendly : YYYY/M[M]/D[D] (2001/11/20) ; To calculate a date less than given assign a negative integer (ie. -45 ) ; ;RETURNS Either a positive integer value of days between two given dates, ; or a (Gregorian) date string. ; ;DEPENDENCIES None ! ; ;EXAMPLES ; break on ; call "[path]DateCalc.udf" ; ; "boot.ini last modified : " + DateCalc(@date,substr(getfiletime("c:boot.ini"),1,10)) ; + " days ago ..." ? ? ; ; $mod = 60 ; "in/before $mod day(s) it was/will be " + DateCalc(@date,$mod) ? ? ; ; get $ function DateCalc($date1, $DateOrMod, optional $SingleDigit) dim $_intDate1, $_intYear1, $_intMonth1, $_intDay1 dim $_intDate2, $_intYear2, $_intMonth2, $_intDay2 $date1 = split($date1,'/') if ubound($date1) <> 2 exit 1 endif $_intYear1 = val($date1[0]) $_intMonth1 = val($date1[1]) $_intDay1 = val($date1[2]) if $_intMonth1 < 3 $_intMonth1 = $_intMonth1 + 12 $_intYear1 = $_intYear1 - 1 endif $_intDate1 = $_intDay1 + ( 153 * $_intMonth1 - 457 ) / 5 + 365 * $_intYear1 + $_intYear1 / 4 - $_intYear1 / 100 + $_intYear1 / 400 - 306 select case vartype($DateOrMod) = 3 $_intDate2 = $_intDate1 + $DateOrMod if instr($_intDate2,'-') $_intDate2 = val(substr($_intDate2,2,len($_intDate2)-1)) endif $_intYear2 = ( 100 * ( ( ( 100*($_intDate2+306)-25)/3652425) - ( ((100*($_intDate2+306)-25)/3652425)/4) ) + (100*($_intDate2+306)-25) ) / 36525 $_intMonth2 = ( 5 * ( ( ( 100*($_intDate2+306)-25)/3652425) - ( ((100*($_intDate2+306)-25)/3652425)/4) + ($_intDate2+306) - 365 * $_intYear2 - $_intYear2 / 4 ) + 456 ) / 153 $_intDay2 = ( ( ( 100*($_intDate2+306)-25)/3652425) - ( ((100*($_intDate2+306)-25)/3652425)/4) + ($_intDate2+306) - 365 * $_intYear2 - $_intYear2 / 4 ) - ( 153 * $_intMonth2 - 457 ) / 5 if $_intMonth2 > 12 $_intYear2 = $_intYear2 + 1 $_intMonth2 = $_intMonth2 - 12 endif if not $SingleDigit if len($_intYear2 ) < 4 $_ = execute("for $i=1 to 4-len($$_intYear2) $$_intYear2 = '0' + $$_intYear2 next") endif $_intMonth2 = right("0" + $_intMonth2,2) $_intDay2 = right("0" + $_intDay2,2) endif $DateCalc = '' + $_intYear2 + '/' + $_intMonth2 + '/' + $_intDay2 case vartype($DateOrMod) = 8 $DateOrMod = split($DateOrMod,'/') if ubound($DateOrMod) <> 2 exit 1 endif $_intYear2 = val($DateOrMod[0]) $_intMonth2 = val($DateOrMod[1]) $_intDay2 = val($DateOrMod[2]) if $_intMonth2 < 3 $_intMonth2 = $_intMonth2 + 12 $_intYear2 = $_intYear2 - 1 endif $_intDate2 = $_intDay2 + ( 153 * $_intMonth2 - 457 ) / 5 + 365 * $_intYear2 + $_intYear2 / 4 - $_intYear2 / 100 + $_intYear2 / 400 - 306 $DateCalc = $_intDate1 - $_intDate2 ;comment the next line if you wish to return negative results also !!! if instr($DateCalc,'-') $DateCalc = val(substr($DateCalc,2,len($DateCalc)-1)) endif case 1 exit 1 endselect endfunction ;------------------------------------------------------------------------------------------- Function Replace($SourceString, $SearchString, $ReplaceString, Optional $First, Optional $CaseSensitive) ; Effectue le remplacement d'une chaine par une autre. Dim $String1 Dim $String2 Dim $Finished $Finished = 0 $Counter = 0 $String1 = $SourceString If $CaseSensitive $PreviousState = SetOption("CaseSensitivity", "On") EndIf While Not $Finished $String2 = $String1 $Location = InStr($String1, $SearchString) If $Location > 0 $String1 = Substr($String1, 1, $Location - 1) + $ReplaceString + Substr($String1, $Location + Len($SearchString), Len($SourceString) - $Location + Len($SearchString) + 1) Else $Finished = 1 EndIf If $First $Finished = 1 EndIf If $String1 = $String2 $Finished = 1 EndIf Loop $Replace = $String1 $barul = SetOption("CaseSensitivity", $PreviousState) EndFunction ;------------------------------------------------------------------------------------------- ; initialize environement variables Function init_temp_dir() $tmp_directory=ExpandEnvironmentVars("%tmp%") IF (substr($tmp_directory,len($tmp_directory),1) <> "") $tmp_directory=$tmp_directory+"" ENDIF EndFunction ;------------------------------------------------------------------------------------------- ; init debug file based on date Function init_debug_file() $TomorD = @MDAYNO $TomorM = @MONTHNO $TomorY = @YEAR If $TomorD < 10 $TomorD = "0" + $TomorD EndIf If $TomorM < 10 $TomorM = "0" + $TomorM EndIf $debug_file="traceinfo-"+$TomorD+$TomorM+$TomorY+"-"+@TICKS+".log" EndFunction
Je suis nouveau ici j’aime se site ya beaucoup d’information jai besoin de conseil aussi je suis débutant
Merci à toi et bienvenue
C’est fait !
Bonjour, tres utile ce programme , je n’arrive pas à le telecharger , serait il possible de reactiver le lien ? merci et bonne fete de fin d’année !
Un autre script de backup fort intéressant:
http://fds.mvps.org/fiches/Fiche-09.htm