1. #1
    Candidat au Club
    Homme Profil pro
    Informaticien en retraite
    Inscrit en
    avril 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Informaticien en retraite

    Informations forums :
    Inscription : avril 2017
    Messages : 5
    Points : 3
    Points
    3

    Par défaut Sous CMD comment supprimer dans un répertoire et ses sous-répertoires tous les fichiers à taille=O

    J'utilise un outil de copie rapide pour alimenter une clé usb à partir d'un répertoire et tous ses sous-répertoires.
    L'outil crée les noms de fichiers avant la copie proprement dite, et lorsque la place vient à manquer sur la clé, ces fichiers demeurent avec une taille à zéro.
    J'effectue des fusions à chaque transfert de données sur la clé et je choisis de garder les fichiers existants pour n'alimenter que les nouveaux fichiers, (ce qui est plus évidemment rapide que de tout écraser sur une clé de 64 Go !)
    Aussi, comme l'outil ne permet pas d'écraser seulement les fichiers de taille nulle, je voudrais éliminer ces fichiers de la clé pour qu'à la nouvelle fusion, ils soient recopiés.
    Seulement, je butte sur les commandes For /F, car celles-ci parcourent les sous-répertoires à partir d'un répertoire parent préalablement fixé, ce qui aboutit à des noms de répertoires trop longs (pour ce pauvre vieux DOS).
    J'en viens à me demander si c'est possible en fichier de commande, (sans déplacer des montagnes... de code), ou si ce serait plutôt réalisable en VB ou avec un shell Unix (comme il en existe d'adaptés à Windows), mais là,c'est moi qui cale...
    J'ai adapté ce bout de batch en utilisant une commande trouvée sur internet :
    for /f "tokens=1*" %i in ('forfiles /p "%cd%" /c "cmd /c echo @fsize @path"') do if /i %~zj equ 0 echo %j>> test.txti equ 0 echo %j>> sortie.txt
    mais il inscrit sur le fichier sortie.txt les répertoires qui ont un fichier vide, et non pas les seuls fichiers de taille nulle qu'ils contiennent !

  2. #2
    Expert éminent
    Avatar de hackoofr
    Homme Profil pro
    Enseignant
    Inscrit en
    juin 2009
    Messages
    3 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : juin 2009
    Messages : 3 346
    Points : 8 090
    Points
    8 090

    Par défaut


    Peut-être une piste ici
    Zero_bytes_Del.bat
    Code BAT : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    @echo off
    for /r %%F in (*) do if %%~zF==0 del "%%F"
    pause

  3. #3
    Candidat au Club
    Homme Profil pro
    Informaticien en retraite
    Inscrit en
    avril 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Informaticien en retraite

    Informations forums :
    Inscription : avril 2017
    Messages : 5
    Points : 3
    Points
    3

    Par défaut

    Citation Envoyé par hackoofr Voir le message

    Peut-être une piste ici
    Zero_bytes_Del.bat
    Code BAT : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    @echo off
    for /r %%F in (*) do if %%~zF==0 del "%%F"
    pause
    J'ai testé sous cmd: for /r %F in (*) do if %~zF==0 echo "%F" >> test.txt
    L'évaluation de la taille ne fonctionne pas et restitue un vide. Heureusement que j'avais testé avec echo à la place de delete, car j'obtiens un truc bizarre à chaque occurrence, mon répertoire de test étant C:\Users\Untel:
    C:\Users\Untel>if == 0 echo "C:\Users\Untel\AppData\Local\Application Data\Application Data\Application Data\Application Data\Application Data\Application Data
    \Application Data\Application Data\Application Data\Application Data\Application Data\Google\Chrome\User Data\Default\Cache\f_0046f5" 1>>test.txt

  4. #4
    Candidat au Club
    Homme Profil pro
    Informaticien en retraite
    Inscrit en
    avril 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Informaticien en retraite

    Informations forums :
    Inscription : avril 2017
    Messages : 5
    Points : 3
    Points
    3

    Par défaut

    Eureka!!! cà marche pour moi...
    La procédure qui suit permet d'extraire les noms des fichiers avec leur taille (dans les paramètres %1 et %2 à l'intérieur de :liste appelé par call) mais elle extrait en même temps les noms des répertoires et sous-répertoires qui ont parmi leurs fichiers un ou des fichiers vides.
    Comme je ne veux pas supprimer ces répertoires, il faut les identifier: pour cela, je considère que les noms de fichiers sont du type nom.ext alors que mes répertoires n'ont pas le suffixe .ext et donc pas de point dans leur nom.
    Pour identifier un nom de fichier, le nom doit donc comporter un point dans le quatrième caractère en partant de la fin, ce qui permet d'éliminer ensuite les seuls fichiers vides sans toucher aux répertoires

    setlocal enabledelayedexpansion
    @echo off
    for /f "tokens=1*" %%i in ('forfiles /p "%cd%" /s /c "cmd /c echo @fsize @path"') do call :liste %%j%% %%~zj
    EndLocal
    goto :eof

    :liste
    if %2 NEQ 0 goto :eof
    echo %~1>long
    for %%a in (long) do set /a long=%%~za -2
    if %long% LSS 4 goto :eof
    set nom=%~1
    set pt="%nom:~-4,1%"
    if %pt% EQU "." echo del %~1 /q >> b:\Mesdoc\test\suppr.cmd
    goto :eof

    ATTENTION: il se peut que certains répertoires aient un nom avec un point sur le 4ème caractère en partant de la fin: dans ce cas il conviendrait de les éliminer du fichier suppr.cmd, bien que dans mes tests ils n'aient pas été supprimés, (sans doute parce qu'ils n'étaient pas vides).
    Il suffit ensuite de lancer l'exécution de ce fichier suppr.cmd pour supprimer tous les fichiers vides du répertoire et de ses sous-répertoires (après avoir précédemment vérifié le contenu, car je n'apporte ici aucune garantie à ce code livré tel quel)

    NB: j'aimerais bien savoir pourquoi il ne faut qu'un % devant et derrière les variable dans :liste, alors que certains prétendent qu'il en faut 2 devant et derrière chaque variable d'une procédure batch...

  5. #5
    Candidat au Club
    Homme Profil pro
    Informaticien en retraite
    Inscrit en
    avril 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Informaticien en retraite

    Informations forums :
    Inscription : avril 2017
    Messages : 5
    Points : 3
    Points
    3

    Par défaut

    Une autre voie serait de lister tous les fichiers du répertoire racine et ses sous-répertoires par la commande DIR /B /S > liste_fichiers, mais ceci n'éliminerait pas le problème des noms de répertoires.
    D'ou la grosse QUESTION: comment identifier sans équivoque possible sous DOS si un nom dans une liste correspond à un fichier ou à un répertoire, que la liste soit obtenu par DIR ou FORFILES ?

  6. #6
    Expert éminent
    Avatar de hackoofr
    Homme Profil pro
    Enseignant
    Inscrit en
    juin 2009
    Messages
    3 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : juin 2009
    Messages : 3 346
    Points : 8 090
    Points
    8 090

    Par défaut

    Citation Envoyé par Torix Voir le message
    Une autre voie serait de lister tous les fichiers du répertoire racine et ses sous-répertoires par la commande DIR /B /S > liste_fichiers, mais ceci n'éliminerait pas le problème des noms de répertoires.
    D'ou la grosse QUESTION: comment identifier sans équivoque possible sous DOS si un nom dans une liste correspond à un fichier ou à un répertoire, que la liste soit obtenu par DIR ou FORFILES ?

    Quand vous utilisez cette commande Dir /A-D; Vous allez juste lister les fichiers sans les dossiers.
    D'après le help de la commande DIR /?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    /A    Affiche les fichiers dotés des attributs spécifiés.
    attributs :
               D  Répertoires                  R  Lecture seule
               H  Caché                        A  Archive
               S  Système                      I  Fichiers indexés sans contenu
               L  Points d’analyse             -  Préfixe de négation
    Code BAT : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    @echo off
    Rem ici juste pour tester avec le dossier temporaire
    set "Folder=%Temp%"
    for /f "delims=" %%A in ('DIR /A-D /B /S "%Folder%"') do (
        if %%~zA==0 echo."%%A" est vide (zero octes^)
    )
    pause & exit

  7. #7
    Candidat au Club
    Homme Profil pro
    Informaticien en retraite
    Inscrit en
    avril 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Informaticien en retraite

    Informations forums :
    Inscription : avril 2017
    Messages : 5
    Points : 3
    Points
    3

    Par défaut

    Salut Hackoofr et merci beaucoup pour cette astuce: "je l'avais pas vue"
    Bien vu. Je considère donc le sujet définitivement résolu.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/04/2016, 10h14
  2. Réponses: 4
    Dernier message: 13/05/2015, 10h33
  3. Réponses: 21
    Dernier message: 03/11/2014, 17h43
  4. Réponses: 5
    Dernier message: 25/06/2007, 23h25
  5. Réponses: 4
    Dernier message: 24/09/2004, 10h17

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