Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1384 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1861195
cedric00
Posté le 13-03-2009 à 14:13:04  profilanswer
 

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
mood
Publicité
Posté le 13-03-2009 à 14:13:04  profilanswer
 

n°1861240
olivthill
Posté le 13-03-2009 à 15:08:40  profilanswer
 

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 {} \;


n°1861263
cedric00
Posté le 13-03-2009 à 15:56:00  profilanswer
 

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 :)

n°1861361
cedric00
Posté le 13-03-2009 à 19:53:08  profilanswer
 

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

n°1861426
Elmoricq
Modérateur
Posté le 14-03-2009 à 03:08:06  profilanswer
 

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
n°1862130
cedric00
Posté le 16-03-2009 à 15:57:17  profilanswer
 

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

n°1862134
Elmoricq
Modérateur
Posté le 16-03-2009 à 16:01:34  profilanswer
 

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

n°1862142
cedric00
Posté le 16-03-2009 à 16:12:27  profilanswer
 

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
n°1862165
cedric00
Posté le 16-03-2009 à 16:40:44  profilanswer
 

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

n°1862168
cedric00
Posté le 16-03-2009 à 16:48:11  profilanswer
 

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
mood
Publicité
Posté le 16-03-2009 à 16:48:11  profilanswer
 

n°1863695
cedric00
Posté le 19-03-2009 à 17:10:48  profilanswer
 

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
n°1863718
Elmoricq
Modérateur
Posté le 19-03-2009 à 17:28:11  profilanswer
 

man date
man mv

n°1863722
cedric00
Posté le 19-03-2009 à 17:34:50  profilanswer
 

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 :)

n°1863726
Elmoricq
Modérateur
Posté le 19-03-2009 à 17:40:15  profilanswer
 

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.

n°1863736
cedric00
Posté le 19-03-2009 à 17:51:43  profilanswer
 
n°1863939
cedric00
Posté le 20-03-2009 à 11:14:55  profilanswer
 

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
n°1864118
cedric00
Posté le 20-03-2009 à 16:12:03  profilanswer
 

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

n°1864188
Sve@r
Posté le 20-03-2009 à 19:09:37  profilanswer
 

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.
n°1864808
cedric00
Posté le 23-03-2009 à 15:21:55  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

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

 

Sujets relatifs
[RESOLU] Adresse SanS "WWW"automatiser l'envoi d'un fichier à un serveur jsp
Fichier de link pour powerpcdossier, sous dossier, nombre de fichier, poids
redimensionner un graphique [Resolu][C#, Résolu] UserControl, classes en propriété et code du concepteur.
[Shell] : supprimer des caractères en fin de lignes[résolu] Aide pour compilation
[php] [RESOLU] aide case switch automatisé php 
Plus de sujets relatifs à : [Résolu][shell] suppresion de dossier/fichier datant plus de 30 jours


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR