script shell

script shell - Shell/Batch - Programmation

Marsh Posté le 05-07-2007 à 16:51:26    

bonjour,  
voila je débute en script shell dans le cadre d'un stage.
mon but est de naviguer dans un dossier comportant plusieurs sous dossiers afin d'en trier les fichiers selon leurs extensions et de copier ensuite ces mêmes fichiers dans un autre dossier crée une fois le tri terminé.
seul problème c'est que lorsque 2 images d'un sous dossier différent ont le même nom lors de la copie il y a un problème impossible de copier.
c'est pourquoi je voulais savoir comment faire pour copier l'arborescence de départ vide dans mes nouveaux dossiers et faire le tri ensuite.
ca parait abstrait comme ça je vais essayer avec un exemple:
j'ai un dossier de base DOCUMENTS dans celui ci 3 sous dossiers 1, 2, et 3 avec à l'intérieur des fichiers de types jpg, pdf, tif...
dans mon dossier d'arrivée FINAL j'ai mes dossier JPG, PDF, TIF.. ou je veux mettre tous les fichiers ayant les extensions correspondantes gardant l'arborescence 1,2,3 ainsi a la fin j'aurais FINAL > JPG > 1 > 001.jpg, 002.jpg et FINAL > JPG > 2 > 001.jpg ...  
voila si ya un problème de compréhenstion n'hésitez pas a me demander
merci pour votre aide!!
a très vite

Reply

Marsh Posté le 05-07-2007 à 16:51:26   

Reply

Marsh Posté le 05-07-2007 à 20:32:42    

Tu peux essayer quelque chose comme ça :
 

find DOCUMENTS -type f |
awk -v dest_dir=FINAL '
   {
      levels = split($0, path, /\//);
      if (levels != 3) next;
      sdir = path[2];
      file = path[3];
      ext  = file;
      if (! sub(/^.*\./, "", ext)) next;
      ddir = dest_dir "/" toupper(ext) "/" sdir;
      dest_sdir[ddir]++;
      copy[$0] = sprintf("%s/%03d.%s", ddir, dest_sdir[ddir], ext);
   }
   END {
      print "\n# Création arborescence destination\n"
      for (ddir in dest_sdir)
         print "mkdir -p " ddir;
      print "\n# Copie des fichiers dans arborescence destination\n";
      for (file in copy)
         print "cp",file,copy[file];
   }
' > ./copy_files.sh
. ./copy_files.sh

Voici un exemple d'arborescence à copier :

DOCUMENTS:
1/  2/  3/
 
DOCUMENTS/1:
file10.jpg  file10.pdf  file11.jpg  file11.pdf  file12.tif
 
DOCUMENTS/2:
file20.tif  file21.jpg  file22.jpg
 
DOCUMENTS/3:
file10.jpg  file30.pdf

Le fichier ./copy_files.sh généré et exécuté :


# Création arborescence destination
 
mkdir -p FINAL/JPG/1
mkdir -p FINAL/JPG/2
mkdir -p FINAL/JPG/3
mkdir -p FINAL/PDF/1
mkdir -p FINAL/PDF/3
mkdir -p FINAL/TIF/1
mkdir -p FINAL/TIF/2
 
# Copie des fichiers dans arborescence destination
 
cp DOCUMENTS/2/file21.jpg FINAL/JPG/2/001.jpg
cp DOCUMENTS/1/file11.jpg FINAL/JPG/1/002.jpg
cp DOCUMENTS/1/file10.jpg FINAL/JPG/1/001.jpg
cp DOCUMENTS/2/file22.jpg FINAL/JPG/2/002.jpg
cp DOCUMENTS/1/file11.pdf FINAL/PDF/1/002.pdf
cp DOCUMENTS/3/file30.pdf FINAL/PDF/3/001.pdf
cp DOCUMENTS/3/file10.jpg FINAL/JPG/3/001.jpg
cp DOCUMENTS/1/file10.pdf FINAL/PDF/1/001.pdf
cp DOCUMENTS/2/file20.tif FINAL/TIF/2/001.tif
cp DOCUMENTS/1/file12.tif FINAL/TIF/1/001.tif


 
Jean-Pierre.

Reply

Marsh Posté le 06-07-2007 à 09:32:09    

Merci beaucoup pour ta réponse rapide!!!
l'idée que ce que je veux faire est possible me réconforte seul petit problème c'est que je comprends pas très bien les lignes de codes que tu as écrit (et oui chui débutante!!) mais surtout ce que je vois dans le résultat que tu as obtenu c'est que les noms de fichiers ont été modifié alors que moi je voudrais tout copier tel quel sans rien modifier juste récupérer et trier les fichiers en gardant la même arborescence de départ... je sais pas si j'ai été très claire mais merci encore !!
autre chose comme je suis sur ma lancée, est ce que c'est possible de modifier le dpi d'une image jpg à travers le script j'ai cru voir ça dans un forum mais je me rappelle plus de la ligne de code...
merci merci merci
a très vite

Reply

Marsh Posté le 08-07-2007 à 11:29:15    

Voici une autre version commentée du script qui préserve le nom du fichier :


# La liste des fichiers du répertoire DOCUMENTS (et de ses sous-répertoires)
# est traitée par la commande awk qui va générer un fichier contenant toutes
# commandes necessaires à la copie des fichiers.
 
find DOCUMENTS -type f |
awk -v dest_dir=FINAL '
 
   # Pour chaque fichier trouvé, les informations necessaires à la copie
   # sont mémorisées dans le tableau copy. Ce dernier comporte une entrée
   # par fichier (index = chemenin complet actuel du fichier) dont la valeur
   # est le chemin complet du fichier aprés copie.
   # On constitue aussi, la liste des répertoires finaux dans le tableau
   # dest_dir.
 
   {
      levels = split($0, path, /\//);            # Décomposition du chemin du fichier
      if (levels != 3) next;                     # Il doit  y avoir 3 niveaux (DOCUMENTS/sous-rep/fichier)
                                                 #   si ce n est pas le cas, on passe au fichier suivant.
      sdir = path[2];                            # Sous-répertoire du fichier
      file = path[3];                            # Nom du fichier
      ext  = file;                               # Extension du fichier = Nom du fichier, dans lequel on supprime
      if (! sub(/^.*\./, "", ext)) next;         #    tout jusqu au dernier point. S il n y a pas d extension,
                                                 #    on passe au fichier suivant.
      ddir = dest_dir "/" toupper(ext) "/" sdir; # Répertoire final.
      dest_sdir[ddir]++;                         # Le répertoire final est mémorisé dans le table dest_sdir
                                                 #   en tant qu index du tableau.
      copy[$0] = sprintf("%s/%s", ddir, file);   # Le chemin complet du fichier final est mémorisé
                                                 #   dans le tableau copy avec pour index le chemin du
                                                 #   fichier à copier.
   }
 
   # Tous les fichier ont été mémorisées.
   # Les commandes necessaires à la copie des fichier va être générée.
   # On commence par générer les commandes de création des répertoires de destination.
   # Les commandes de copie sont ensuite générées.
 
   END {
 
      print "\n# Création arborescence destination\n"
      for (ddir in dest_sdir)                   # Pour chaque index du tableau dest_sdir (= répertoire destination)
         print "mkdir -p " ddir;                # Génération commande de création du répertoire.
 
      print "\n# Copie des fichiers dans arborescence destination\n";
      for (file in copy)                        # Pour chaque index du fichier copy (= chemin fichier à copier)
         print "cp",file,copy[file];            #Génération de la commande de copie.
   }
'> ./copy_files.sh  
 
# Exécution du fichier généré
. ./copy_files.sh

Reply

Sujets relatifs:

Leave a Replay

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