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

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  script shell

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

script shell

n°1582893
noukies
Posté le 05-07-2007 à 16:51:26  profilanswer
 

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

mood
Publicité
Posté le 05-07-2007 à 16:51:26  profilanswer
 

n°1582995
aigles
Posté le 05-07-2007 à 20:32:42  profilanswer
 

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.

n°1583093
noukies
Posté le 06-07-2007 à 09:32:09  profilanswer
 

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

n°1583689
aigles
Posté le 08-07-2007 à 11:29:15  profilanswer
 

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


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

  script shell

 

Sujets relatifs
[Shell] ScriptShell aide sur mon script
Script shell (sql)Pb [SCRIPT SHELL] Help!!!
Plugin script shell pour eclipse?Script shell : lecture dans un fichier et mise en forme
Socket en script shell[Shell] Petit probleme avec un script
[Shell / C] Script shell en tant que démon ?[script shell] grep -f sur de grandes quanités de données
Plus de sujets relatifs à : script shell


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