web-dev-qa-db-fra.com

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

J'ouvre normalement le dossier parent et cherche * 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 souvent en essayant de copier autant de fichiers. fichiers via l'interface graphique. Je ne sais pas à quel point cela sera plus efficace grâce à la commande Invite 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.

8
Sean

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 à l'extérieur 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 souhaitez le mettre dans un fichier de commandes, remplacez %i par %%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 suffisamment de temps, vous pouvez jouer en toute sécurité et copier les fichiers plutôt que de les déplacer, au cas où quelque chose se passe mal. Il suffit de changer MOVE en COPY dans la commande ci-dessus.

14
misha256

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.

3
e.g

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

2
Noshad Chaudhry