Déplacer tous les fichiers de plusieurs sous-dossiers dans le dossier parent

8

Je voudrais normalement ouvrir le dossier parent et rechercher *afin de sélectionner tous les fichiers des sous-dossiers, mais dans ce cas, j'ai plus d'un million de fichiers que je dois trier. Mon explorateur se bloque donc souvent lorsque je tente de copier autant de fichiers. à travers l'interface graphique. Je ne sais pas à quel point cela sera plus efficace grâce à l'invite de commande ou à un fichier de commandes, mais cela vaut la peine d'essayer, je suppose.

Ce que je dois faire est de faire en sorte que

|parent
|    |123
|    |    123abc.png
|    |456
|    |    456def.png
|    |789
|    |    789ghi.png

devient

|parent
|    123abc.png
|    456def.png
|    789ghi.png

Oui, ma structure de fichier actuelle contient les 3 premiers caractères du nom de fichier attribué au nom du dossier, si cela peut aider à les trier.

Sean
la source

Réponses:

14

Utilisez FOR / R à l’invite de commande:

[FOR / R] parcourt l'arborescence de dossiers en commençant par le chemin [lecteur:] et exécute l'instruction DO sur chaque fichier correspondant.

Commencez par créer un dossier intermédiaire en dehors du dossier parent à partir duquel vous déplacez des fichiers. Cela évitera d'éventuelles références circulaires.

Dans votre cas, la commande ressemblerait à quelque chose comme ceci:

FOR /R "C:\Source Folder" %i IN (*.png) DO MOVE "%i" "C:\Staging Folder"

Si vous voulez mettre cela dans un fichier de commandes, changez %ipour %%i.

Notez que les guillemets sont importants, ne manquez rien d’eux. Ils garantissent que les noms de fichiers contenant des espaces sont traités correctement.

Une fois le déplacement terminé, vous pouvez renommer / déplacer le dossier intermédiaire comme vous le souhaitez.

CONSEIL: Si vous avez suffisamment d’espace disque à graver et que vous disposez de beaucoup de temps, vous pouvez jouer en toute sécurité et copier les fichiers plutôt que de les déplacer, au cas où il se produirait un problème. Il suffit de changer MOVEà COPYdans la commande ci-dessus.

Misha256
la source
+1 qui a vraiment aidé! Note to self self cependant - Utilisez des chemins entiers, les chemins relatifs ne semblaient pas détecter l'emplacement des fichiers dans les sous-dossiers.
bigp
3

Voici un exemple de code:

:loop
    for /d %%D in (%1\*) do (move "%%D\*" %1\ && rmdir "%%D")
    SHIFT
    set PARAMS=%1
if not %PARAMS%!==! goto loop

Avec cette version, vous faites glisser le dossier à partir duquel vous souhaitez supprimer le sous-dossier vers le lot. Tous les fichiers des sous-dossiers sont déplacés dans le dossier parent. Je l'utilise pour les fichiers d'archives téléchargés qui ont ou n'ont pas de sous-dossier au hasard. Remarquez, il a été créé avec un seul sous-dossier, comme spécifique à mon cas.

'Shift' consiste à passer à l'argument suivant, lorsque vous faites glisser plusieurs sous-dossiers à la fois sur le script.

par exemple
la source
2

Utilisez également la variable d’environnement %% ~ dpi qui fait référence au dossier dans lequel se trouvent les fichiers. Vous pouvez ensuite supprimer la barre oblique inversée qui renverrait le dossier parent des fichiers. Ci-dessous est juste que.

SetLocal EnableDelayedExpansion   
FOR /R "C:\Source Folder" %%i IN (*.png) DO (       
       Set "CurrFile=%%~i"     
       Set "TMPdp=%%~dpi"   
       Set "ParFldr=!TMPdp:~0,-1!"    
       @Echo MOVE "%%~i" "!ParFldr!" ) & REM Delete echo to move. Run to test.

Le ! active le développement dynamique et peut être utilisé pour %% ~ i ainsi que pour ParFldr. Donc, le %% ~ je peux être! CurrFldr! Cela sera en fait nécessaire pendant vos tests car certains fichiers auront des chaînes que Batch n’aimera pas. Par pas comme, je veux dire qu'ils vont provoquer l'échec et la sortie du script. Je viens de changer tous les %% A en %% i pour plus de clarté. Cela ne fait vraiment aucune différence si un A a été utilisé ou un minuscule i L'important est d'utiliser systématiquement la même lettre, alors j'ai changé chaque %% A en un %% i.

Noshad Chaudhry
la source
Bien que cela puisse répondre à la question, il est presque impossible de le dire à cause du formatage médiocre. Prenez le temps de modifier votre réponse et de la rendre lisible. Veuillez lire l' aide de Markdown .
DavidPostill
0

forfiles /s /m *.FILETYPE /c "cmd /c move @file .." devrait déplacer n'importe quel fichier de FILETYPE spécifié dans son dossier parent

Serkan
la source