Script qui fonctionne, mais

Script qui fonctionne, mais - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 10-02-2004 à 19:47:29    

J'ai écrit un script qui prend un nombre variable de paramètres (qui sont des répertoires existants dans le répertoire courant).
 
Pour chaque répertoire, ca déplace tous ses fichiers dans le répertoire courant et si les noms de fichier sont identiques, ca concatene dans le répertoire courant. Quand les répertoires nommés sont vides, il sont détruit.
 
Ca fonctionne (enfin, je crois) mais est-ce que ca serait possible, au lieu de:
 
-%./script.sh  
Quel dossier voulez vous nettoyer?
 
ca serait:
-%./script. dossierpournettoyer
 
?
 
voici le script:
 

Code :
  1. #!/bin/bash
  2. echo "Quel dossier voulez vous nettoyer?"
  3. read folder
  4. if [ ! -d $folder ]; then
  5. echo "Ce dossier n'existe pas"
  6. else
  7. for file in $folder/* ; do
  8. exist=${file##*/}
  9. if [ -f $exist ]; then
  10. cat $file >> $exist
  11. else
  12. cp $folder/* $folder/..
  13. fi
  14. done
  15. fi
  16. for subfold in $folder/* ; do
  17. if [ ! -f $subfold ] || [ -d $subfold ]; then
  18. echo "DOSSIER CONTENANT DES SOUS-DOSSIERS"
  19. else
  20. rm -rf $folder
  21. fi
  22. done

Reply

Marsh Posté le 10-02-2004 à 19:47:29   

Reply

Marsh Posté le 10-02-2004 à 19:53:37    

Tout betement folder=$1 à la place de ton read ?

Reply

Marsh Posté le 10-02-2004 à 19:53:37    

tu enlèves les 2 premières lignes que tu remplaces simplement par :
 
[ "$1" != "" ] && folder="$1"
 
edit : la vache la synchro :ouch: c'est rare


Message édité par BMOTheKiller le 10-02-2004 à 19:54:08
Reply

Marsh Posté le 10-02-2004 à 20:45:06    

super, merci ca marche super bien...
 
un autre chose, si le dossier contient des sous-dossiers, le script fonctionne...
 
mais si le dossier contient des dossiers ET des sous-dossiers, le script copie les fichiers dans le répertoire parent et efface quand même le sous-dossier...

Reply

Marsh Posté le 11-02-2004 à 10:36:04    

Je vois tout d'abord trois problèmes avec ta boucle 'for file in $folder/*'
 
1) Si le répertoire est vide, tu récupères "$folder/*" dans la variable 'file'.
Du coup tu vas avoir une erreur sur le cat ou le cp (qui devrait être 'cp $file $folder/..')
 
Pour éviter ça :
for file in $(ls -1 $folder)
 
2)Tu ne prends pas en compte les fichiers dont le nom commence par '.' (exemple .profile), ces derniers ne sont donc pas déplacés.
 
Si tu veux les prendre en compte il te faut faire :
for file in $(ls -1a $folder | grep -Ev '^(\.|\.\.)$')
 
3) Si ton répertoire contient des sous-répertoires, tu risque d'avoir des problèmes.
Si un fichier existe déjà avec le nom du sous-répertoire, tu vas faire un cat du sous-répertoire ce qui n'a aucun sens.
 
 
 
Dans ta dernière boucle 'for subfold in $folder/*' tu supprime le répertoire s'il contient encore un fichier et comme tu laisses en places les fichiers '.*' ...
En effet si le fichier $folder/.profile existe :
subfold=$folder/.profile
[ ! -f $subfold ]= Faux
[ -d $subfold ] = Faux
[ ! -f $subfold ] || [ -d $subfold ] = Faux
Donc rm -rf $folder
 
Si tu veux supprimer le contenu du répertoire s'il ne contient plus de fichiers ni de sous-répertoire :
if [ -z "$(ls -1a $folder) ] ; then
   rm -rf $folder
fi


---------------
Jean Pierre.
Reply

Sujets relatifs:

Leave a Replay

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