Copie, déplacement, renommage de fichier, etc

Copie, déplacement, renommage de fichier, etc - Shell/Batch - Programmation

Marsh Posté le 12-11-2009 à 15:02:16    

Bonjour programmeurs,
 
Je souhaiterai automatiser des tâches récurentes pour gagner du temps.
Si seulement c'était simple l'informatique!!!
Je ne connait rien en programmation.
 
Il me semble que le batch est le plus adapté pour ce genre de manip.
 
J'ai cela pour le moment :
 
                Dossier xxx
                /          \
     Dossier yy       Dossier zz
       /      \                /     \
 dossier  dossier    dossier  dossier
  Jpeg      Dng        Jpeg     Dng
    |           |             |        |
 fichier    fichier       fichier  fichier
   jpg        Dng          jpg      Dng
 
 
 
Je voudrais arriver à ça :
 
                Dossier xxx
                /          \
     Dossier yy       Dossier zz
           |                  |
        fichier           fichier
          jpg               jpg
 
Après visionnage, je pense que s'est compréhensible. Mais dites moi si vous n'y arrivez pas.
J'ai jeter un oeil de mon coté sur les commandes batch pour essayer de faire quelque chose mais il n'y a aucune explication sur la syntaxe précise. Il y a juste les commandes.
 
Merci beaucoup si quelqu'un peu m'aider.

Reply

Marsh Posté le 12-11-2009 à 15:02:16   

Reply

Marsh Posté le 12-11-2009 à 16:06:05    

J'arrive difficilement à savoir comment procéder mais je pense que ceci pourrait fonctionner :
1. Supprimer tous les fichiers de Dossier xxx excepté les .jpg
2. Déplacer les fichiers Jpeg dans leur dossier parent
3. Supprimer les dossiers vides


Message édité par djodjolyon le 12-11-2009 à 16:06:30
Reply

Marsh Posté le 12-11-2009 à 17:50:40    

avec find par exemple:
 
 [:icon4] attention le -exec rm il pardonne pas.
 
pour supprimer les fichier Dng

Code :
  1. find dossierxxx -name *.Dng -exec rm {} \;


 
pour déplacer les autres fichiers

Code :
  1. for f in $(find dossierxxx  -name "*.jpg" ) ; do mv $f $(dirname $(dirname $f)); done


 
pour supprimer les répertoires vides

Code :
  1. find dossierxxx  -type d -empty -exec rmdir {} \;


 

Reply

Marsh Posté le 12-11-2009 à 19:11:05    

Merci pataluc,
 
Par contre j'arrive pas  à éxécuter le batch.
 
Je viens d'essayer de lancer le premier mais ça ne fonctionne pas.
J'ai mis ça dans mon batch :

Code :
  1. @echo off
  2. find dossierxxx -name *.dng -exec rm {} \;

Le nom de mon dossier est dossierxxx et il se trouve dans le même dossier que le batch en question.
Tous les dng sont toujours présents dans le dossier.
 
Qu'est-ce que j'ai oublié?


Message édité par djodjolyon le 12-11-2009 à 19:13:09
Reply

Marsh Posté le 13-11-2009 à 11:20:26    

les commandes que j'ai donné sont des commandes unix, si tu es sur windows, récupère les sur http://unxutils.sourceforge.net/ et ensuite ca devrait marcher (windows a une commande find qui correspond au grep unix, mais pas au find unix)...

Reply

Marsh Posté le 13-11-2009 à 15:49:49    

Excuses-moi pour mon ignorance. Mais je n'y arrive pas. J'ai récupérer unxutils. Donc à priori je doit pouvoir appliquer le script. Mais comment exactement.
Est-ce qu'il faut éxécuter un fichier dans unxutils (il y a beaucoup d'éxécutables)?
Est-ce que je dois mettre unxutils dans un dossier particulier?
Pour le script, je créé un xxx.bat?
Avec le code que tu m'as donné, il faut rajouter un "@echo off" ou autre chose?
 
Merci d'avance

Reply

Marsh Posté le 13-11-2009 à 16:33:36    

ca risque d'être un peu compliqué si tu n'es pas trop à l'aise avec les scripts.
 
ou alors tu dézippe juste le find.exe et le sed.exe, tu le mets qqpart (par exemple dans d:\unxutils) et tu l'appelle avec

Code :
  1. d:\unxutils\find.exe dossierxxx -name *.dng | sed "s/^/del /"

ca te génère les commandes dos pour supprimer les fichiers (tu les rediriges dans un .bat, et tu l'exécute, avec

Code :
  1. d:\unxutils\find.exe dossierxxx -name *.dng | sed "s/^/del /" > delpng.bat
  2. delpng.bat


 
ca va te générer la liste des fichiers

Reply

Marsh Posté le 15-11-2009 à 04:37:09    

OK
J'ai passé beaucoup, beaucoup de temps à essayer de faire fonctionner tout ça.
 
J'ai réussi.
Voila le batch que j'avais réalisé :

Code :
  1. c:\unxutils\find.exe -name *.dng | c:\unxutils\sed.exe "s/^/del \"/";"s/$/\"/" > deldng.bat
  2. deldng.bat


Mais j'ai trouvé une commande dos qui me le fait ça plus simplement :

Code :
  1. DEL /Q/S *.dng


 
Ce qui donne maintenant : :)

Code :
  1. @echo off
  2. color f0
  3. :debut
  4. rem Entrer le nom du dossier à traiter
  5. set /p dossier= Entrer le nom du dossier à traiter:
  6. rem Si il existe, continuer
  7. if exist %dossier%>nul goto suite
  8. rem Si il n'existe pas, recommencer
  9. echo Le fichier spécifié est introuvable.
  10. goto debut
  11. :suite
  12. rem copier le dossier en rajoutant le copyright
  13. xcopy /s/I ".\%dossier%" ".\%dossier% ¸2009"
  14. rem rentrer dans le dossier que l'on vient de copier
  15. cd %dossier% ¸2009
  16. rem supprimer tous les fichiers du dossier sauf les jpg
  17. del /Q /S *.dng *.txt
  18. rem déplacer les fichiers jpg
  19. :fin
  20. exit


Il ne me reste maintenant plus qu'à déplacer les fichiers jpg dans leur dossiers parents respectifs.
Mais je n'ai pas réussi. Voilà ce que j'ai tenté :

Code :
  1. c:\unxutils\find.exe -name *.jpg | c:\unxutils\sed.exe "s/^/move \"/";"s/$/\" ../" > deplacerjpg.bat
  2. deplacerjpg.bat

Sauf que les jpg arrivent tous dans le dossier parent d'ou je lance le batch. Je ne sais pas comment faire du coup  :??:
Le premier batch m'ecrit deplacerjpg.bat sous cette forme :

Code :
  1. move ".\test\affiche.jpg" ..


Je viens de trouver un bout de code qui pourrait fonctionner une fois adapté. Mais j'ai du mal avec la commande for.

Code :
  1. dir /a /a:d /b > dir.txt
  2. FOR /F %%A IN (dir.txt) DO move %%A\*.*
  3. del dir.txt


Message édité par djodjolyon le 18-11-2009 à 01:03:37
Reply

Marsh Posté le 15-11-2009 à 16:54:32    

alors pour les guillemets, tu peux remplacer ton

Code :
  1. sed "s/^/del /"

par

Code :
  1. sed "s/\(.*\)/del \"\1\"/"

et ca devrait marcher...

Reply

Marsh Posté le 16-11-2009 à 00:57:42    

j'avais pas vu ta réponse. Du coup j'ai édité le post précédent... Ca va mettre le souk!!


Message édité par djodjolyon le 16-11-2009 à 01:25:56
Reply

Marsh Posté le 16-11-2009 à 00:57:42   

Reply

Marsh Posté le 16-11-2009 à 14:56:29    

du coup t'en es d'ou? t'as réussi a faire ce que tu voulais?

Reply

Marsh Posté le 16-11-2009 à 16:37:51    

J'ai presque réussi. Tout est dans mon avant dernier post.
Il ne me manque plus qu'à trouver comment déplacer un fichier jpg dans son dossier parent.
J'ai trouvé un code qui apparemment fonctionne pour quelqu'un mais je n'arrive pas à l'adapter à mon cas pour qu'il fonctionne.
Voila le code trouvé :

Code :
  1. dir /a /a:d /b > dir.txt
  2. FOR /F %%A IN (dir.txt) DO move %%A\*.*
  3. del dir.txt


Message édité par djodjolyon le 16-11-2009 à 22:41:44
Reply

Marsh Posté le 16-11-2009 à 16:50:03    

tu peux utiliser le modificateur "~dp" pour transformer %%a en son nom de répertoire, puis ajouter "..\" derrière pour spécifier le répertoire parent:
 

Code :
  1. FOR /F %%A IN (dir.txt) DO move %%A %%~dpA..\

(dans le cas ou dir.txt contient les chemins complet des fichiers à déplacer)

Reply

Marsh Posté le 17-11-2009 à 02:53:20    

Je bloque, même avec tes explications pataluc.
 
Ce que je veux faire c'est déplacer chaque fichiers jpg dans son répertoire parent, selon le niveau auquel il se trouve.  
 
                Dossier xxx                                                             Dossier xxx
                /           \                                                                /           \  
     Dossier yy       Dossier Jpeg                                         Dossier yy     fichiers Jpeg
       /                        |                             =>                       |      
 Dossier Jpeg         fichiers Jpeg                                        fichiers Jpeg  
      |          
 fichiers Jpeg  
 
 
Je n'arrive pas à créer la commande For pour me faire ça.
 
Pour le moment j'ai créé un fichier text qui s'appelle "dir.txt". Il me liste chaque fichiers présent dans le dossier où j'éxécute mon batch.
Voilà un bout de mon fichier txt

Code :
  1. C:\Nouveau dossier\test\test.jpg
  2. C:\Nouveau dossier\test\22.10.09 xxxxxxx\xxxxjpg\xxxxxxxxxxxx-69.jpg


 
J'éxécute mon batch dans le dossier test
 
Ca doit pouvoir se réaliser avec "for" mais j'arrive pas à comprendre cette commande.
 
J'arrive à visualiser à peu près comment faire mais j'arrive pas à le concrétiser.
 
Avec une expression régulière avec "sed", sinon?


Message édité par djodjolyon le 17-11-2009 à 03:01:30
Reply

Marsh Posté le 17-11-2009 à 10:09:18    

la commande que j'ai mis dans mon dernier post devrait marcher, mais j'ai l'impression qu'elle a du mal avec les espace dans les nom de dossier...

Reply

Marsh Posté le 17-11-2009 à 12:27:23    

Effectivement, la commande fonctionne chez moi aussi mais comme j'ai des espaces de partout, ça fonctionne nul part!!
 
Est-ce que tu pense qu'on peut résoudre ce problème facilement?


Message édité par djodjolyon le 17-11-2009 à 13:47:03
Reply

Marsh Posté le 17-11-2009 à 13:53:40    

c'est bien ce que je disait, il a un pb avec les espaces dans les noms de dossiers...
 
normalement en utilisant usebackq dans le for ca devrait résoudre le pb, mais j'arrive pas à le faire fonctionner... je regarde comment contourner avec un sed

Reply

Marsh Posté le 17-11-2009 à 14:13:12    

avec ca:  

Code :
  1. sed "s/\(.*\\\)\(.*\\.*\)/move \"\1\2\" \"\1\"/" dir.txt

ca devrait marcher, mais chez moi ca ne marchait pas (a cause du fait que c'est un portage de la commande sous windows à priori), et du coup j'ai du rajouter --text pour basculer en text mode:

Code :
  1. sed --text "s/\(.*\\\)\(.*\\.*\)/move \"\1\2\" \"\1\"/" dir.txt


 
derrière yaura plus qu'a balancer ca dans un bat...

Reply

Marsh Posté le 17-11-2009 à 18:18:44    

J'ai une bonne et une mauvaise nouvelle.
 
La bonne c'est que la 2ème commande marche parfaitement bien et que le batch est à 2 doigts de fonctionner.
 
La mauvaise c'est qu'il y a 2 doigts!!
 
Je voulais ajouter d'autres commandes à la suite, mais elles ne sont pas lu.
Si je les éxécute dans un autre batch, ça fonctionne.
 
Je crois que c'est dû au mode texte "--text".
 
Comment en sort-on?
 
Merci.


Message édité par djodjolyon le 17-11-2009 à 18:20:40
Reply

Marsh Posté le 17-11-2009 à 19:35:00    

quel genre de commandes?

Reply

Marsh Posté le 17-11-2009 à 19:46:25    

pataluc a écrit :

quel genre de commandes?


 
Celles-ci précisément :

Code :
  1. @echo off
  2. rem ///// SUPPRIMER LES DOSSIERS VIDES
  3. cd c:\Nouveaudossier\test ¸2009
  4. for /f "delims=" %%i in ('dir "%~f1" /ad /b /s ^| sort /R') do rd "%%i" 1>NUL 2>&1
  5. rem ///// SUPPRIMER LES FICHIERS CREES
  6. del dossierparent.bat
  7. cd..
  8. del dir.txt

Mais même "pause" tout seul ça ne fonctionne pas


Message édité par djodjolyon le 18-11-2009 à 01:03:03
Reply

Marsh Posté le 17-11-2009 à 21:48:12    

t'as ajouté ca après les move?

Reply

Marsh Posté le 17-11-2009 à 22:04:03    

pataluc a écrit :

t'as ajouté ca après les move?


oui, entre la commande "dossierparent.bat" et la commande "exit"
 

Code :
  1. @echo off
  2. color f0
  3. :debut
  4. rem ///// ENTRER LE NOM DU DOSSIER A TRAITER
  5. set /p dossier= Entrer le nom du dossier … traiter:
  6. rem ///// SI IL EXISTE, CONTINUER
  7. if exist %dossier%>nul goto suite
  8. rem ///// SI IL N'EXISTE PAS, REPRENDRE AU DEBUT
  9. echo Le fichier sp‚cifi‚ est introuvable.
  10. goto debut
  11. :suite
  12. rem ///// COPIER LE DOSSIER ET LE RENOMMER EN AJOUTANT LE COPYRIGHT
  13. xcopy /s/I ".\%dossier%" ".\%dossier% ¸2009"
  14. rem ///// RENTRER DANS LE DOSSIER QUE L'ON VIENT DE COPIER
  15. cd %dossier% ¸2009
  16. rem ///// SUPPRIMER TOUS LES FICHIERS TXT ET DNG DU DOSSIER ET SOUS DOSSIERS
  17. del /Q /S *.dng *.txt
  18. rem ///// DEPLACER LES FICHIERS DANS LEUR REPERTOIRE PARENT RESPECTIF
  19. dir /a:-d/b/s > dir.txt
  20. pause
  21. c:\unxutils\sed.exe --text "s/\(.*\\\)\(.*\\.*\)/move \"\1\2\" \"\1\"/" dir.txt > dossierparent.bat
  22. dossierparent.bat
  23. exit

D'ailleurs il y a un reste de mon test avec pause! Juste avant le move la commande pause fonctionne bien.


Message édité par djodjolyon le 18-11-2009 à 01:02:42
Reply

Marsh Posté le 17-11-2009 à 22:46:56    

ah ok, c'est normal l'appel a dossierparent.bat interromps ton script... il faut le lancer avec call devant:

Code :
  1. call dossierparent.bat

Reply

Marsh Posté le 17-11-2009 à 23:57:25    

Parfait!
 
Bon j'ai un dernier bug dont je viens de m'apercevoir. Après je te laisse tranquille.
 
Jusqu'à présent, je testais mon batch sur un dossier appelé test. Tout fonctionnait.
Comme j'ai des espaces dans mes dossiers, j'ai fait un essai avec test 01. Et là surprise ça ne marche pas.
Forcément, il y a un espace. Donc je rajoute les guillemets comme ça : "test 01".
Sauf que la commande xcopy ne fonctionne plus maintenant puisque quand je rentre la variable "test 01" et qu'il la renomme, il l'écrit comme ça : "test 01" @2009
 
Mais je ne sais pas comment gérer ce problème comme d'habitude.
 
J'ai tenté d'inclure sed dans xcopy de cette manière mais sans succès :

Code :
  1. xcopy /s/I ".\%dossier%" ".\%dossier% | c:\unxutils\sed.exe "s/$.{1}/ ¸2009\"/""


 
Je te remet tout le code que j'ai au cas où.

Code :
  1. @echo off
  2. color f0
  3. :debut
  4. rem ///// ENTRER LE NOM DU DOSSIER A TRAITER
  5. set /p dossier= Entrer le nom du dossier … traiter:
  6. rem ///// SI IL EXISTE, CONTINUER
  7. if exist %dossier%>nul goto suite
  8. rem ///// SI IL N'EXISTE PAS, REPRENDRE AU DEBUT
  9. echo Le fichier sp‚cifi‚ est introuvable.
  10. goto debut
  11. :suite
  12. rem ///// COPIER LE DOSSIER ET LE RENOMMER EN AJOUTANT LE COPYRIGHT
  13. xcopy /s/I ".\%dossier%" ".\%dossier% ¸J.Howell"
  14. rem ///// RENTRER DANS LE DOSSIER QUE L'ON VIENT DE COPIER
  15. cd %dossier% ¸J.Howell
  16. rem ///// SUPPRIMER TOUS LES FICHIERS TXT ET DNG DU DOSSIER ET SOUS DOSSIERS
  17. del /Q /S *.dng *.txt
  18. rem ///// DEPLACER LES FICHIERS DANS LEUR REPERTOIRE PARENT RESPECTIF
  19. dir /a:-d/b/s > dir.txt
  20. c:\unxutils\sed.exe --text "s/\(.*\\\)\(.*\\.*\)/move \"\1\2\" \"\1\"/" dir.txt > dossierparent.bat
  21. call dossierparent.bat
  22. rem ///// SUPPRIMER LES DOSSIERS VIDES
  23. for /f "delims=" %%i in ('dir "%~f1" /ad /b /s ^| sort /R') do rd "%%i" 1>NUL 2>&1
  24. rem ///// SUPPRIMER LES FICHIERS CREES
  25. del dossierparent.bat
  26. cd..
  27. del dir.txt
  28. exit


Message édité par djodjolyon le 18-11-2009 à 01:56:37
Reply

Marsh Posté le 18-11-2009 à 14:03:05    

xcopy a l'air d'avoir des soucis avec les espaces dans les noms. essaie avec les noms courts (8 caractères plus "~1" )... mais sans conviction.

Reply

Marsh Posté le 18-11-2009 à 14:58:42    

Ca fonctionne s'il n'y a pas de chiffre. Mais rien de bien grave. Je renommerai à la main avant de lancer le script.
 
!!! MISSION ACCOMPLIE !!!
Le batch fonctionne très bien.
Un grand merci pataluc pour ton suivi sans faille.
Ca va me permettre de gagner pas mal de temps pour gérer mes fichiers. Ce qui à vrai dire n'est pas le plus sympas à faire.
Merci encore. J'pensais que tu perdrais patience ;)
 
Je remets le batch complet pour d'autres qui voudraient faire le même genre de choses.  

Code :
  1. @echo off
  2. color f0
  3. :debut
  4. rem ///// ENTRER LE NOM DU DOSSIER A TRAITER
  5. set /p dossier= Entrer le nom du dossier … traiter:
  6. rem ///// SI IL EXISTE, CONTINUER
  7. if exist %dossier%>nul goto suite
  8. rem ///// SI IL N'EXISTE PAS, REPRENDRE AU DEBUT
  9. echo Le fichier sp‚cifi‚ est introuvable.
  10. goto debut
  11. :suite
  12. rem ///// COPIER LE DOSSIER ET LE RENOMMER EN AJOUTANT LE COPYRIGHT
  13. xcopy /s/I ".\%dossier%" ".\%dossier% ¸J.Howell"
  14. rem ///// RENTRER DANS LE DOSSIER QUE L'ON VIENT DE COPIER
  15. cd %dossier% ¸J.Howell
  16. rem ///// SUPPRIMER TOUS LES FICHIERS TXT ET DNG DU DOSSIER ET SOUS DOSSIERS
  17. del /Q /S *.dng *.txt
  18. rem ///// DEPLACER LES FICHIERS DANS LEUR REPERTOIRE PARENT RESPECTIF
  19. dir /a:-d/b/s > dir.txt
  20. c:\unxutils\sed.exe --text "s/\(.*\\\)\(.*\\.*\)/move \"\1\2\" \"\1\"/" dir.txt > dossierparent.bat
  21. call dossierparent.bat
  22. rem ///// SUPPRIMER LES DOSSIERS VIDES
  23. for /f "delims=" %%i in ('dir "%~f1" /ad /b /s ^| sort /R') do rd "%%i" 1>NUL 2>&1
  24. rem ///// SUPPRIMER LES FICHIERS CREES
  25. del dossierparent.bat
  26. cd..
  27. del dir.txt
  28. exit


Message édité par djodjolyon le 18-11-2009 à 15:09:16
Reply

Marsh Posté le 30-11-2009 à 20:08:23    

slt tlm,
je m'incruste un peu car je vois que ca parle de *.bat  :D  
Je voudrais copier le fichier a.txt qui ai dans c:\ dans c:\windows.
j'ai essayé  
 
echo on
copy "a.txt" "C:\WINDOWS\"
echo off
 
mais ca marche pas, il me marque "le fichier spécifié est introuvable"
 
quelqu'un peut le filer un coup de pouce?
merci

Reply

Marsh Posté le 01-12-2009 à 00:19:49    

Essaie avec le chemin complet : copy "C:\a.txt" "C:\WINDOWS\"

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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