[Résolu][shell] suppresion de dossier/fichier datant plus de 30 jours

suppresion de dossier/fichier datant plus de 30 jours [Résolu][shell] - Shell/Batch - Programmation

Marsh Posté le 13-03-2009 à 14:13:04    

Bonjour,
 
Mon but est de supprimer les dossiers et fichiers qui se trouvent dans des dossiers datant plus de 30 jours. Voici son arborescence :

Home ->client 1
        ->client 2
        ->...

 
Donc je veux supprimer tous les fichiers et dossiers qui se trouvent dans client 1, client 2 etc ... (sans supprimer les dossiers client 1, etc et les fichiers a la racine de home).
 
Voici mon code :
 

Code :
  1. #script1
  2. for folder in `find -type d`; do
  3. echo $folder
  4. sh script2 "$folder"
  5. echo " Finish "
  6. done


Code :
  1. #script2
  2. OLD_IFS="$IFS"
  3. IFS=$'\n'
  4. for erase in 'find -ctime +30'; do
  5. echo $erase
  6. rm -Ri "$erase"
  7. echo " Done "
  8. done
  9. IFS="$OLD_IFS"


 
Et donc mon problème est le script2 ne va pas chercher dans les dossiers client etc (par rapport au script1), il va chercher a la racine de home (là ou le script est placé).
 
Comment mon script2 pourrait faire sa recherche a partir du script1 s'il vous plait ?
 
Merci,


Message édité par cedric00 le 25-03-2009 à 15:28:02
Reply

Marsh Posté le 13-03-2009 à 14:13:04   

Reply

Marsh Posté le 13-03-2009 à 15:08:40    

Donc c'est de l'Unix !
 
Alors cela peut se faire en une seule ligne :

find Home -name "*" -type f -mtime +30 -exec rm -f {} \;


 
Pour tester, lister les fichiers au lieu de les supprimer, avec la ligne suivante :

find Home -name "*" -type f -mtime +30 -exec ls -l {} \;


Reply

Marsh Posté le 13-03-2009 à 15:56:00    

Oui c'est de l'Unix, désolé de ne pas l'avoir précisé.
 
Sinon ta commande me liste tous les fichiers qui se trouvent dans home et ses sous dossiers mais moi je voudrais juste ceux qui se trouvent dans ses sous dossiers (ainsi que les dossiers des sous dossiers...)
 
Merci d'avance :)

Reply

Marsh Posté le 13-03-2009 à 19:53:08    

Voila un screen qui peut peut etre mieux expliqué ce que j'ai fais.
 
http://img9.imageshack.us/img9/7888/scriptc.jpg
 
Et on voit la derniere ligne qu'il efface "script4" donc les fichiers a la racine de home :(
 
C'est pour ca que je voudrais que mon deuxième script fasse sa recherche dans le premier script et ensuite supprime les fichiers et sous dossiers :)
 
Quelqu'un peut m'aider s'il vous plait ? :'(
 
Merci :D

Reply

Marsh Posté le 14-03-2009 à 03:08:06    

man ksh (ou man bash, ou man csh, bref man <le shell que tu utilises> )
Et man test aussi.

 

Méthode à employer : parcours de tous les fichiers de ton répertoire, et si c'est un sous-répertoire, alors find dessus :

for i in Home/*; do [ -d $i ] && find $i -type f -mtime +30 -exec rm -f {} \; ;done


Message édité par Elmoricq le 14-03-2009 à 03:08:29
Reply

Marsh Posté le 16-03-2009 à 15:57:17    

Ca ne fait pas ce que je voudrais.
 
Je voudrais que ma seconde recherche (fichier et dossiers supérieurs a 30 jours) se fasse a partir de ma premiere recherche (recherche des dossiers dans le dossier home).
 
En gros je veux supprimer les fichiers et sous dossiers qui se trouvent dans les dossiers "client X" si ils datent de plus de 30 jours.
 
ps: je suis débutant en unix (ou bash)
 
Merci

Reply

Marsh Posté le 16-03-2009 à 16:01:34    

C'est exactement ce que je t'ai mis.

Reply

Marsh Posté le 16-03-2009 à 16:12:27    

a oui parfait :) j'avais mis au mauvais endroit mon script.
 
Ensuite je voudrais supprimer les dossiers vides qui se trouvent dans client X (sans supprimer les dossiers client X). Comment puis je le rajouter dans le script stp ?
 
Puis a quoi sert le -d ? c'est pour faire une recherche sur les dossiers ?
 
Merci beaucoup


Message édité par cedric00 le 16-03-2009 à 16:19:31
Reply

Marsh Posté le 16-03-2009 à 16:40:44    

J'ai reussi pour la suppresion des dossiers vides :).
 
Sinon je voudrais bien que tu m'expliques stp le "do [ -d $i ]".
 
J'essaye de faire une extraction dans un fichier log et ensuite je mets ce que j'ai fait.
 
Merci en tout cas

Reply

Marsh Posté le 16-03-2009 à 16:48:11    

Ha non en faite j'ai refais une boucle comme ceci :
 

Code :
  1. for i2 in Home/*; do [ -d $i2 ] && find $i2 -type d -empty -exec rm -rf {} \; done


 
Mais il faudrait qu'il répète ceci jusqu'à qu'il n'y a plus de dossiers vide. Mais il le fait qu'une seule fois (donc si il y a un dossier A vide dans un autre dossier B, il supprime le premier dossier A mais pas ensuite le B).
 
Pour faire ceci, dois je utiliser un while ?
 
Merci


Message édité par cedric00 le 17-03-2009 à 10:44:35
Reply

Marsh Posté le 16-03-2009 à 16:48:11   

Reply

Marsh Posté le 19-03-2009 à 17:10:48    

Bonjour,
 
Suite a mon script avec plusieurs opération (suppresion de fichiers datant de plus de 30 jours dans des dossiers et suppressions des dossiers vides ensuite).
 
Je voudrais faire des log de ces opérations (qui seront faites une fois par jour) avec comme nom de fichier la date du jour. Voici le script :
 

Code :
  1. #/bin/sh
  2. #Suppresion des fichiers datant de plus de 30 jours
  3. OLD_IFS="$IFS"
  4. IFS=$'\n'
  5. #Recherche et suppresion des fichiers datant de plus de 30 jours et extraction de la liste de ces fichiers dans un log (date:AAAA/MM/JJ)
  6. for erase in `home/*`; do  
  7. [ -d $erase ] && find $erase -type f -mtime +30 -ls >> home/log/log_fichier.txt -exec rm -f {} \;
  8. done
  9. #Recherche et suppresion des dossiers vides et extraction de la liste de ces dossiers dans un log (date:AAAA/MM/JJ)
  10. for erase2 in `find home/* -depth -mindepth 1 -type d`; do
  11. [ -d $erase2 ] && find $erase2 -type d -empty -ls >> home/log/log_dossier.txt -exec rm -rf {} \;
  12. done
  13. echo " - Done - "
  14. IFS="$OLD_IFS"


 
Donc est ce que c'est possible de changer mon log_fichier.txt et log_dossier.txt par un %date%.log dans ce format "AAAA/MM/JJ" par exemple s'il vous plait ?
 
Merci d'avance :)
 
Cédric


Message édité par cedric00 le 19-03-2009 à 17:14:11
Reply

Marsh Posté le 19-03-2009 à 17:28:11    

man date
man mv

Reply

Marsh Posté le 19-03-2009 à 17:34:50    

man date j'ai deja cherché toute l'aprem :(, je ne trouve pas la commande qui permet de nommer un fichier par rapport a la date du jour a partir d'une extraction d'un contenu dans un fichier.
 
et sinon j'y ai pensé au renommage mais je devrais le faire en deux temps et en faite je voudrais pas le renommé mais juste le nommé date.log au lieu de log_fichier.txt :)

Reply

Marsh Posté le 19-03-2009 à 17:40:15    

Ben tu calcules d'abord la date dans une variable, puis tu fais un mv sur le fichier en utilisant ta variable pour le nouveau nom.

Reply

Marsh Posté le 19-03-2009 à 17:51:43    

Reply

Marsh Posté le 20-03-2009 à 11:14:55    

C'est bon j'ai reussi, merci Elmoricq !
 
Voila le script final :
 

Code :
  1. #/bin/sh
  2. #Suppresion des fichiers datant de plus de 30 jours
  3. OLD_IFS="$IFS"
  4. IFS=$'\n'
  5. date=`date "+%Y-%m-%d"`
  6. #Recherche des dossiers dans "home" et suppresion des fichiers (dans ces dossiers) datant de plus de 30 jours et extraction de la liste de ces fichiers dans un log (Files_AAAA-MM-JJ)
  7. for erase in home/*;
  8.         do [ -d $erase ] && find $erase -type f -mtime +2 -ls >> home/log/Files_$date.log -exec rm -f {} \;
  9. done
  10. #Recherche et suppresion des dossiers vides et extraction de la liste de ces dossiers dans un log (Folders_AAAA-MM-JJ)
  11. for erase2 in `find home/* -depth -mindepth 1 -type d`;
  12.         do [ -d $erase2 ] && find $erase2 -type d -empty -ls >> home/log/Folders_$date.log -exec rm -rf {} \;
  13. done
  14. echo " - Done - "
  15. IFS="$OLD_IFS"


Juste une dernière petite chose, est ce que c'est possible d'enlever dans mes fichiers log le \ s'il vous plait, quand le nom du fichier a un espace, voici mon fichier log (sur un test) :
 
573014    8 -rw-r--r--   1 root     root          203 mar 13 05:29 home/client/script4
573015    8 -rw-r--r--   1 root     root         2423 fév 25 11:11 home/client/README
573008    8 -rw-r--r--   1 root     root          629 fév 25 11:11 home/client\ 1/IDELicense(2).txt
573010    8 -rw-r--r--   1 root     root          629 fév 25 11:11 home/client\ 1/X/IDELicense(2).txt
573012    4 -rw-------   1 root     root            0 mar 11 05:51 home/client\ 1/pierre\ dupont
573013    8 -rw-r--r--   1 root     root          629 fév 25 11:11 home/client\ 1/IDELicense.txt
573000    8 -rw-r--r--   1 root     root         2423 fév 25 11:11 home/client\ 2/README
573002    8 -rw-r--r--   1 root     root         1373 fév 25 11:11 home/client\ 2/VM
 
Merci d'avance :)


Message édité par cedric00 le 20-03-2009 à 11:23:25
Reply

Marsh Posté le 20-03-2009 à 16:12:03    

Ce n'est pas possible ce que je voudrais faire ? (sachant que les noms des dossiers "client X" sont des noms différents...)

Reply

Marsh Posté le 20-03-2009 à 19:09:37    

cedric00 a écrit :

Ce n'est pas possible ce que je voudrais faire ? (sachant que les noms des dossiers "client X" sont des noms différents...)


Si tu veux renommer tes fichiers avec "\", voici une boucle de traitement

Code :
  1. #!/bin/sh
  2. # Traitement de chaque fichier du répertoire
  3. ls |while read file
  4. do
  5.    # Création du nouveau nom en supprimant le "\" du nom de fichier
  6.    new=`echo "$file" |sed -e "s/\\//g"`
  7.    # Si le nouveau nom est différent de l'ancien => c'est que l'ancien avait un "\" => on le renomme
  8.    test "$file" != "$new" && mv "$file" "$new"
  9. done


 
J'ai tapé ça vite fait sans tester. J'ai un petit doute sur les "\\" du sed car je crains qu'il faille surprotéger chaque "\" à cause des backquottes. Si ça marche pas, remplace "s/\\//g" par "s/\\\\//g"
 
Si tu veux juste supprimer le "\" dans le fichier log, alors 2 commandes

Code :
  1. sed -e "s/\\//g" fichier_log >/tmp/copie
  2. cp /tmp/copie fichier_log


Message édité par Sve@r le 20-03-2009 à 19:13:33

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 23-03-2009 à 15:21:55    

A cloturé !
 
Merci a toi Sve@r ca a bien marché :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed