DjRamzy Posté(e) le 31 mars 2009 Posté(e) le 31 mars 2009 Bonjour, ou Bonsoir, Après le script permettant de voir si un utilisateur à modifier son compte 'home', je me suis rendu compte que j'allais souvent enlever tous les fichier temporaires des différents O.S. : par exemple "Thumbs.db" ou "desktop.ini" de windows ainsi que ".DS_Store" de OSX. J'ai donc décidé de commencer un script qui Nettoie les partitions "home" dans un premier temps, puis plus générale par la suite. Voici mon script qui est bien avancé car il fonctionne très bien sur mon PC sous UNIX (nettoie même les partitions windows montées en ntfs), mais n'est pas tout à fait opérationnel pour le syno : #!/bin/sh # # clean # # Script de nettoyage récursif (.DS_Store;Thumbs.db;desktop.ini) # # By Djramzy Version du 31 Mars 2009 ##################################################################### # # Variable par défaut ######################## # Votre dossier nettoyé par défaut lorsqu'on lance clean sans option : RACINNE="/volume1/homes" # Liste des fichiers à effacer par défaut (séparé par des espaces): TRASH=".DS_Store Thumbs.db desktop.ini" # Version VERSION="Version 1.0 du script de nettoyage" # Activation des commentaires lors de la suppression ("true" ou "false") #COMMENTAIRE="false" COMMENTAIRE="true" # # Fonctions ######################## usage() { echo "Usage :" echo "" echo "clean [-farvV] [option]" echo "" echo " [dossier] : Mode normal" echo "-f [dossier] : Mode force" echo "-a fichier : Ajouter un fichier à supprimmer" echo "-r : Remise à zéro des fichiers à supprimer" echo " Par défaut : "$TRASH echo "-v : Affiche la liste des fichiers à supprimer" echo "-V : Version" exit 1; } creer_fichier_temp() { if [ ! -r "/tmp/clean" ] then echo $TRASH > /tmp/clean fi; } effacer () { if [ $FORCE = "true" ] then FICHIER=`more /tmp/clean` rm -f $FICHIER if [ $COMMENTAIRE = "true" ] then echo "Nettoyage du dossier : "`pwd` fi else echo"" echo "Voulez-vous nettoyer le dossier : $DOSSIER? (y/n) :" read REPONSE if [ $REPONSE = "y" ] then FICHIER=`more /tmp/clean` rm -f $FICHIER if [ $COMMENTAIRE = "true" ] then echo "Nettoyage du dossier : "`pwd` fi fi fi; } clean() { cd "$DOSSIER" if [ $? = "0" ] then effacer for DOSSIER in `ls -A` do if [ -d "$DOSSIER" ] then if [ -r "$DOSSIER" ] then if [ ! -h "$DOSSIER" ] then clean fi fi fi done cd ../ else exit 1 fi; } # # Programme ######################### FORCE="false" creer_fichier_temp case $1 in -f ) FORCE="true" if [ $2 ] then if [ ! -d $2 ] then usage fi RACINNE=$2 fi ;; -V ) echo $VERSION exit 0 ;; -a ) if [ $2 ] then FICHIER=`more /tmp/clean` FICHIER=$FICHIER" "$2 echo $FICHIER > /tmp/clean echo "Nouvelle liste des fichiers à supprimer :" echo $FICHIER exit 0 else usage fi ;; -r ) echo $TRASH echo "Voulez-vous vraiment remettre la liste par défaut ? (y/n)" read reponse if [ $reponse = "y" ] then echo $TRASH > /tmp/clean echo "Remise à zéro des fichiers à supprimer" else echo "La liste n'a pas été remise à zéro" fi exit 0 ;; -v ) echo "Liste des fichiers à supprimer :" FICHIER=`more /tmp/clean` echo $FICHIER exit 0 ;; "" ) ;; * ) if [ ! -d $1 ] then usage else RACINNE="$1" fi ;; esac cd $RACINNE RACINNEBIS=`pwd` cd ../ DOSSIER=`echo "$RACINNEBIS" | awk -F "/" '{ print $NF }'` if [ ! $DOSSIER ] then DOSSIER="/" fi clean Les problèmes rencontrés sur le synology sont de deux types : - le nom du dossier a un espace dans son nom - le nom du dossier commence par la lettre "-" Même en mettant des guillements autour de la variable $DOSSIER dans la fonction clean cela ne fonctionne pas, je ne vois vraiment pas pourquoi NOTE : En faite sous mon UNIX préféré j'ai le même problème, lorsqu'il voit un répertoire avec un espace il est tout simplement ignoré....
fredlime Posté(e) le 1 avril 2009 Posté(e) le 1 avril 2009 Bonjour, Je n'ai pas tout lu, mais cela ne revient-il pas a la même chose ? #!/bin/sh # # Variable par defaut ######################## RACINE="/volume1/homes" LISTE=".DS_Store Thumbs.db desktop.ini" # for bo in $LISTE; do find $DOSSIER -name "$bo" -exec rm -f {} \; 2> /dev/null done Bonne nuit, Fred.
DjRamzy Posté(e) le 1 avril 2009 Auteur Posté(e) le 1 avril 2009 Merci, je ne connaissais pas la commande 'find' qui est très sympa une fois qu'on a lu la doc J'ai donc recommencer le script, que voici : #!/bin/sh # # clean # # Script de nettoyage(.DS_Store;Thumbs.db;desktop.ini) # # By Djramzy Version du 1 Avril 2009 ##################################################################### # # Variable par défaut ######################## # Votre dossier nettoyé par défaut lorsqu'on lance clean sans option : RACINNE="/volume1/homes" # Liste des fichiers à effacer par défaut (séparé par des espaces): TRASH=".DS_Store Thumbs.db desktop.ini" # Version VERSION="Version 2.0 du script de nettoyage" # # Fonctions ######################## usage() { echo "Usage :" echo "" echo "clean [-farvV] [option]" echo "" echo " [dossier] : Mode normal" echo "-f [dossier] : Mode force" echo "-a fichier : Ajouter un fichier à supprimmer" echo "-r : Remise à zéro des fichiers à supprimer" echo " Par défaut : "$TRASH echo "-v : Affiche la liste des fichiers à supprimer" echo "-V : Version" exit 1; } creer_fichier_temp() { if [ ! -r "/tmp/clean" ] then echo $TRASH > /tmp/clean fi; } clean() { LISTE=`more /tmp/clean` for bo in $LISTE; do find "$RACINNE" -name "$bo" -ok rm -f {} \; done exit 0 } cleanf() { LISTE=`more /tmp/clean` for bo in $LISTE; do find "$RACINNE" -name "$bo" -delete done exit 0 } # # Programme ######################### creer_fichier_temp case $1 in -f ) if [ "$2" ] then if [ ! -d "$2" ] then usage fi RACINNE="$2" fi cleanf ;; -V ) echo $VERSION exit 0 ;; -a ) if [ $2 ] then FICHIER=`more /tmp/clean` FICHIER=$FICHIER" "$2 echo $FICHIER > /tmp/clean echo "Nouvelle liste des fichiers à supprimer :" echo $FICHIER exit 0 else usage fi ;; -r ) echo $TRASH echo "Voulez-vous vraiment remettre la liste par défaut ? (y/n)" read reponse if [ $reponse = "y" ] then echo $TRASH > /tmp/clean echo "Remise à zéro des fichiers à supprimer" else echo "La liste n'a pas été remise à zéro" fi exit 0 ;; -v ) echo "Liste des fichiers à supprimer :" FICHIER=`more /tmp/clean` echo $FICHIER exit 0 ;; "" ) clean ;; * ) if [ ! -d "$1" ] then usage else RACINNE="$1" clean fi ;; esac Je l'ai testé sous UNIX et tout va bien, même les dossiers avec des noms bizarres passent. Mais sous le syno.....la commande find ne marche pas, voici ce que j'ai quand j'entre la commande seul : ######> find /volume1/homes/ -name Thumbs.db -delete BusyBox v1.1.0 (2009.03.06-16:49+0000) multi-call binary Usage: find [PATH...] [EXPRESSION] ceci est pareil avec : -ok rm -f {} \; Avec -exec rm {} \; Il y a un autre problème. L'option -exec à l'air d'être là puisqu'il lance bien les 'rm' mais ceux-ci on un problème avec les noms de dossiers à espaces ou autres.... Pour -ok et -delete je pense que cela est due à la version de 'find' implanté dans le syno, mais pour l'option -exec il devrait y avoir une solution, me trompe-je???????
fredlime Posté(e) le 1 avril 2009 Posté(e) le 1 avril 2009 Bonsoir, Ces espaces, une plaie j'vous dit. On va monter d'un cran, alors #!/bin/sh # # Variable par defaut ######################## dossier="/volume1/homes" liste=".DS_Store|Thumbs.db|desktop.ini" fic_tmp="/tmp/toto" # find $dossier | egrep "$liste" | sed "s/ /?/g" > $fic_tmp # for bo in `cat $fic_tmp`; do rm "$bo" > /dev/null done rm -f $fic_tmp Donc, on lance une recherche de fichier que l'on filtre avec 'egrep' et sa liste. Chaque champ/fichier doit être séparé par un '|' On remplace également chaque espace rencontré par le caractère '?' commande 'sed' Et on renvoie tout cela dans un fichier temporaire. Ensuite il ne reste plus qu'a effacer en listant ce fichier A+ Fred.
fredlime Posté(e) le 1 avril 2009 Posté(e) le 1 avril 2009 Bah moi je veux bien Mais si ton chemin contient des espaces, ton fichier restera là ou il est...... A+ Fred.
DjRamzy Posté(e) le 1 avril 2009 Auteur Posté(e) le 1 avril 2009 Ba pour ma pomme quand on fait (sans le -f pour voir les retours d'erreur) : find /volume1 -type f -name Thumbs.db -exec rm {} \; mon syno m'engueule, par exemple : Ici le dossier s'appelait 'dossier 3' rm: cannot remove `3/Thumbs.db': No such file or directory J'essayerais demain le truc du egrep. Merci et bonne soirée
DjRamzy Posté(e) le 6 avril 2009 Auteur Posté(e) le 6 avril 2009 Bonjour, J'ai enfin réussi a trouver un peu de temps pour finir mon script. Merci Fred pour ton aide, ça m'a bien servi. Voici donc la dernière version qui est opérationnel sur DS-207+ sans ipkg : #!/bin/sh # # clean # # Script de nettoyage(.DS_Store;Thumbs.db;desktop.ini) # # By Djramzy Version du 6 Avril 2009 ##################################################################### # # Variable par défaut ######################## # Votre dossier nettoyé par défaut lorsqu'on lance clean sans option : RACINNE="/volume1/homes" # Liste des fichiers à effacer par défaut (séparé par des |): TRASH="Thumbs.db|.DS_Store|desktop.ini" # Version VERSION="Version 2.1 du script de nettoyage" # Répertoire temporaire REP_TMP="/tmp/clean_tmp" # # Fonctions ######################## usage() { echo "Usage :" echo "" echo "clean [-farvV] [option]" echo "" echo " [dossier] : Mode normal" echo "-f [dossier] : Mode force" echo "-a fichier : Ajouter un fichier à supprimmer" echo "-r : Remise à zéro des fichiers à supprimer" echo " Par défaut : "$TRASH echo "-v : Affiche la liste des fichiers à supprimer" echo "-V : Version" exit 1; } creer_fichier_temp() { if [ ! -r "/tmp/clean" ] then echo $TRASH > /tmp/clean fi; } clean() { LISTE=`more /tmp/clean` find "$RACINNE" | egrep "$LISTE" | sed "s/ /?/g" > $REP_TMP for bo in `cat $REP_TMP`; do echo "Voulez-vous effacer $bo ? (y/n)" read reponse if [ $reponse = "y" ] then rm -rf "$bo" > /dev/null fi done rm -f $REP_TMP exit 0 } cleanf() { LISTE=`more /tmp/clean` find "$RACINNE" | egrep "$LISTE" | sed "s/ /?/g" > $REP_TMP for bo in `cat $REP_TMP`; do rm -rf "$bo" > /dev/null done rm -f $REP_TMP exit 0 } # # Programme ######################### creer_fichier_temp case $1 in -f ) if [ "$2" ] then if [ ! -d "$2" ] then usage fi RACINNE="$2" fi cleanf ;; -V ) echo $VERSION exit 0 ;; -a ) if [ $2 ] then FICHIER=`more /tmp/clean` FICHIER=$FICHIER"|"$2 echo $FICHIER > /tmp/clean echo "Nouvelle liste des fichiers à supprimer :" echo $FICHIER exit 0 else usage fi ;; -r ) echo $TRASH echo "Voulez-vous vraiment remettre la liste par défaut ? (y/n)" read reponse if [ $reponse = "y" ] then echo $TRASH > /tmp/clean echo "Remise à zéro des fichiers à supprimer" else echo "La liste n'a pas été remise à zéro" fi exit 0 ;; -v ) echo "Liste des fichiers à supprimer :" FICHIER=`more /tmp/clean` echo $FICHIER exit 0 ;; "" ) clean ;; * ) if [ ! -d "$1" ] then usage else RACINNE="$1" clean fi ;; esac Pour information : -Le mode normal demande une validation avant la suppression, le mode force ne demande rien. -Il est possible d'ajouter des des fichier à supprimer lors du clean (commande -a, ex: clean -a @eaDir ), on peut aussi remettre la liste par défaut ( -r ). -Pour nettoyer un autre répertoire que celui défini dans le script on peut le mettre en option lorsque l'on lance l'execution ( clean /volume1/photo ). Merci à vous pour votre aide Djramzy
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.