IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Déplacer une partie des fichiers (move) [Batch]


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Octobre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 7
    Par défaut Déplacer une partie des fichiers (move)
    Bonjour a tous,

    Je me permets de vous écrire pour un petit renseignement...

    J'ai un répertoire A qui contient 1 600 000 fichiers qui doivent être déplacés au fils de l'eau dans un répertoire B qui ne peut contenir plus de 20 000 fichiers.

    Est-il possible via la commande move d'indiquer le nombre de fichiers à déplacer?
    Je ne trouve pas d'options dans cette commande me permettant de déplacer un nombre précis de fichiers.

    J'espère avoir été assez clair...

    Merci par avance pour vos propositions...

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 18
    Par défaut
    Je ne suis pas sûr d'avoir compris :
    • Tu veux générer plusieurs répertoires de 20000 fichiers (dans ton exemple 1600000/20000 = 80 répertoires)
    • Tu veux déplacer les fichiers de A vers B mais tu veux arrêter quand le nb de fichiers dans B atteint 20000


    Quelle est la bonne interprétation ? J'ai des idées pour la première mais pas pour la deuxième...

    A+
    Cédric

  3. #3
    Membre régulier
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Octobre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 7
    Par défaut
    Bonjour,

    Malheureusement, il s'agit de la seconde interprétation...

    J'ai un répertoire A avec 1 600 000 fichiers que je dois réintégrer au fils de l'eau dans un répertoire B qui ne doit pas contenir plus de 20 000 fichiers.

    Un traitement traite les données dans le répertoire B et supprime les fichiers. Donc selon le temps de traitements sur le répertoire B, je dois attendre pour transférer à nouveau 20 000 fichiers entre le répertoire A et B.

    Donc j'aimerai créer un traitement permettant de détecter le nombre de fichiers dans le répertoire B pour savoir combien de fichiers je peux transférer du répertoire A vers le B. Et surtout comment transférer un nombre précis de fichiers.

    Voila, merci pour des pistes éventuelles.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 18
    Par défaut
    Compter des fichiers
    Je vois deux méthodes :
    1. boucler sur les fichiers du répertoire B avec "for" et incrémenter une variable à chaque itération avec "set /A compteur+=1"
    2. utiliser "dir" et "find" et trouver un moyen de récupérer le résultat dans une variable


    Personnellement, j'évite de faire des boucles quand je le peux, donc j'ai regardé la deuxième méthode (peut-être plus compliquée mais qui m'intéressait aussi pour d'autres raisons) :
    • La commande "dir /B /A-D %DestDir%\ 2>nul" affiche un listing des fichiers contenus dans le répertoire sans aucune autre information. La variable "DestDir" contient le nom du répertoire. Le "2>nul" en fin de commande permet d'éviter l'affichage d'un message d'erreur si le répertoire est vide
    • On passe le résultat de ce dir à la commande find avec un "|". 'find /V /C "" ' nous donne le nombre de lignes non vides (donc qui correspondent à un fichier)
    • La commande "find" affiche son résultat sur la console. On veut récupérer ce résultat dans une variable. Je ne sais pas faire cela directement (si quelqu'un sait, cela m'intéresse!), mais par contre je sais rediriger le résultat de find vers un fichier, et initialiser une variable avec le contenu d'un fichier


    Déplacer jusqu'à x fichiers maximum

    Là je ferais un compteur et une boucle "for" sur les fichiers du répertoire A. Dans la boucle du for on appelle une routine avec "call" qui fait les choses suivantes :
    • si le compteur dépasse 20000, on ne fait rien
    • sinon, on déplace le fichier
    • puis on incrémente de 1 le compteur



    Au final, le script ci-dessous doit faire ce que tu veux. Tous les affichages écrans sont redirigés sauf les deux commandes "echo" qui donnent le résultat du script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    @echo off
    set tmp_count_file=%TEMP%\count.txt
    set SourceDir=A
    set DestDir=B
    set /A nb_max_files=20000
    
    rem *** Compter les fichiers de DestDir
    dir /B /A-D "%DestDir%\" 2>nul | find /V /C "" > "%tmp_count_file%"
    set /P nb_files= < "%tmp_count_file%"
    del /F /Q %tmp_count_file% 1>nul 2>nul
    if %nb_files%==0 goto move_files
    echo.%DestDir% n'est pas vide : aucun déplacement réalisé
    pause
    goto :eof
    
    :move_files
    rem *** Déplacer les fichiers de SourceDir
    set /A nb_files_moved=0
    for %%f in ("%SourceDir%\*") do (call :move_one_file "%%f")
    echo.%nb_files_moved% fichiers déplacés de %SourceDir% vers %DestDir%
    pause
    goto :eof
    
    :move_one_file
    rem *** Routine déplaçant un fichier si maximum non atteint
    rem %1 contient le fichier à déplacer
    if /I %nb_files_moved% GEQ %nb_max_files% goto :eof
    move /Y "%~1" "%DestDir%\" 1>nul 2>nul
    set /A nb_files_moved+=1
    goto :eof

    NB: Le dernier "goto :eof" n'est pas nécessaire mais il vaut mieux le garder si tu veux rajouter des lignes après la routine

  5. #5
    Membre régulier
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Octobre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 7
    Par défaut
    Je viens de faire plusieurs tests et ca marche super bien.
    Merci beaucoup pour ce script bien complet et avec des commentaires et explications en plus.

    Encore une fois merci!!!

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 18
    Par défaut
    Note que si tu veux déplacer des fichiers si le nombre de fichier dans B est < 20000, au lieu de si B est vide comme dans le script fourni, il te faut :

    tester si nb_files est < 20000 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if /I %nb_files% LSS %nb_max_files%
    calculer le nombre de fichier à déplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set /A nb_files_to_move=%nb_max_files% - %nb_files%

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Copier une partie des répertoires et fichiers d'un dossier
    Par HERVE57 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 01/01/2012, 19h56
  2. [Débutant] Extraire une partie des données d'un fichier à deux colonnes.
    Par NoobTotal dans le forum MATLAB
    Réponses: 3
    Dernier message: 07/12/2011, 17h15
  3. Exportation d'une partie des données des lignes, ...
    Par Pho dans le forum Langage SQL
    Réponses: 4
    Dernier message: 29/06/2005, 10h30
  4. Réponses: 2
    Dernier message: 09/10/2004, 20h45
  5. Exporter seulement une partie des données avec pg_dump ?
    Par Philhz dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 31/07/2004, 09h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo