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

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  Copie, déplacement, renommage de fichier, etc

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Copie, déplacement, renommage de fichier, etc

n°1940051
djodjolyon
Posté le 12-11-2009 à 15:02:16  profilanswer
 

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.

mood
Publicité
Posté le 12-11-2009 à 15:02:16  profilanswer
 

n°1940077
djodjolyon
Posté le 12-11-2009 à 16:06:05  profilanswer
 

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
n°1940142
pataluc
Posté le 12-11-2009 à 17:50:40  profilanswer
 

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 {} \;


 

n°1940172
djodjolyon
Posté le 12-11-2009 à 19:11:05  profilanswer
 

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
n°1940326
pataluc
Posté le 13-11-2009 à 11:20:26  profilanswer
 

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)...

n°1940546
djodjolyon
Posté le 13-11-2009 à 15:49:49  profilanswer
 

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

n°1940591
pataluc
Posté le 13-11-2009 à 16:33:36  profilanswer
 

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

n°1940841
djodjolyon
Posté le 15-11-2009 à 04:37:09  profilanswer
 

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
n°1940886
pataluc
Posté le 15-11-2009 à 16:54:32  profilanswer
 

alors pour les guillemets, tu peux remplacer ton

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

par

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

et ca devrait marcher...

n°1940965
djodjolyon
Posté le 16-11-2009 à 00:57:42  profilanswer
 

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
mood
Publicité
Posté le 16-11-2009 à 00:57:42  profilanswer
 

n°1941168
pataluc
Posté le 16-11-2009 à 14:56:29  profilanswer
 

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

n°1941264
djodjolyon
Posté le 16-11-2009 à 16:37:51  profilanswer
 

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
n°1941275
pataluc
Posté le 16-11-2009 à 16:50:03  profilanswer
 

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)

n°1941410
djodjolyon
Posté le 17-11-2009 à 02:53:20  profilanswer
 

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
n°1941453
pataluc
Posté le 17-11-2009 à 10:09:18  profilanswer
 

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...

n°1941532
djodjolyon
Posté le 17-11-2009 à 12:27:23  profilanswer
 

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
n°1941562
pataluc
Posté le 17-11-2009 à 13:53:40  profilanswer
 

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

n°1941572
pataluc
Posté le 17-11-2009 à 14:13:12  profilanswer
 

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...

n°1941702
djodjolyon
Posté le 17-11-2009 à 18:18:44  profilanswer
 

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
n°1941713
pataluc
Posté le 17-11-2009 à 19:35:00  profilanswer
 

quel genre de commandes?

n°1941714
djodjolyon
Posté le 17-11-2009 à 19:46:25  profilanswer
 

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
n°1941726
pataluc
Posté le 17-11-2009 à 21:48:12  profilanswer
 

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

n°1941728
djodjolyon
Posté le 17-11-2009 à 22:04:03  profilanswer
 

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
n°1941737
pataluc
Posté le 17-11-2009 à 22:46:56  profilanswer
 

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

n°1941746
djodjolyon
Posté le 17-11-2009 à 23:57:25  profilanswer
 

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
n°1941884
pataluc
Posté le 18-11-2009 à 14:03:05  profilanswer
 

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.

n°1941924
djodjolyon
Posté le 18-11-2009 à 14:58:42  profilanswer
 

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
n°1946065
dede021385
mais il est ou DEDE ?!!!
Posté le 30-11-2009 à 20:08:23  profilanswer
 

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

n°1946107
Tuxerman12
Posté le 01-12-2009 à 00:19:49  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


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

  Copie, déplacement, renommage de fichier, etc

 

Sujets relatifs
JAAS & sécuriser fichier de donnéesTransfert Fichier Texte dans ACCESS depuis vba Excel
batch sftp pour recuperer fichier et envoi mailsauver fichier complet du presse-papiers sur le disque dur
[SQL Server 2000] : fichier de sortie "horodaté" (travail)suppression doublons dans fichier texte
requete SQL avec effacement du fichier concerné ?Manipulation basique de fichier texte a l'aide de Perl
Problème fichier de configuration hibernatearbre binaire/fonction recursif/lecture fichier
Plus de sujets relatifs à : Copie, déplacement, renommage de fichier, etc


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