Aplatir la structure du répertoire

15

J'ai un tas de dossiers dans les dossiers. Comme ça

Root Folder
    -- Folder 1
    -- Folder 2
    -- Folder 3
    -- Folder 4

Je veux réduire tous les dossiers afin que tous les fichiers sous dossier1, dossier 2, dossier 3, ... dossier n existent sous le dossier racine.

Quel est le moyen le plus rapide de le faire sous Windows?

Plus de cinq
la source
5
Cela dépend, comment voudriez-vous gérer les noms de fichiers en double?
Mark Allen

Réponses:

19

Il n'y a aucune raison d'utiliser des outils spéciaux ou même des scripts. Utilisez simplement la fonction de recherche dans l'Explorateur.

  1. Ouvrez le dossier que vous souhaitez aplatir dans l'Explorateur.
  2. Créez un nouveau dossier, sélectionnez tous les fichiers (mais pas les dossiers) et faites-les glisser vers ce dossier (cela évitera d'obtenir deux copies de ces fichiers.)
  3. Dans la zone de recherche (celle à droite de la barre d'adresse), saisissez *et appuyez sur Entrée.
  4. Une fois la liste remplie, faites un clic droit et sélectionnez tout, puis faites un clic droit et coupez.
  5. Appuyez sur le bouton Retour pour revenir au dossier d'origine, puis cliquez avec le bouton droit et collez.
  6. Si vous avez des noms en double, vous serez invité à savoir comment gérer cela. Choisissez l'option la plus appropriée pour votre cas d'utilisation. (Je suppose que ce serait pour copier les deux fichiers.) Pour éviter d'être invité à nouveau, assurez-vous d'appliquer cela à tous les fichiers avec la case à cocher en bas.
  7. Sélectionnez tous les dossiers, assurez-vous qu'ils sont vides en consultant la fenêtre contextuelle sur le nombre de fichiers sélectionnés, puis supprimez-les.

Si vous préférez avoir un script pour pouvoir le démarrer et l'oublier, cela peut également être fait. La commande à remplacer mv *\* .est assez facile ( for /r %f in (*.*) do @move "%~f" .) mais je suis sûr que vous aimeriez gérer les doublons, sans les laisser comme dans la réponse de @Nicole Hamilton. Ajouter un numéro au nom de fichier des doublons est probablement le moyen le plus simple de le faire.

Copiez et collez le fichier de commandes suivant dans le Bloc-notes et enregistrez-le sous "flatten.cmd" (y compris les guillemets):

@echo off
cd "%~1"
md tempryfolder
move *.* tempryfolder
for /r %%f in ("*.*") do call :START "%%~f"
for /r /d %%f in (*.*) do rd "%%~f" 
GOTO :EOF
:START
setlocal
If exist "%~n1%~x1" set /a num=2
:LOOP
If exist "%~n1%num%%~x1" (
    set /a num+=1
    goto loop
)
move "%~1" "%~n1%num%%~x1"

Pour utiliser le script, faites simplement glisser le dossier que vous souhaitez aplatir dessus.

trlkly
la source
1
Similaire mais plus facile à comprendre: superuser.com/a/523854/433830
aparente001
Remarque: ce script est essentiellement une bombe fourchette. Je l'utilise sur un dossier avec des milliers de sous-répertoires et des dizaines de milliers de sous-fichiers et l'empreinte mémoire augmente lentement. Je ne pense pas que je vais rencontrer des problèmes de MOO, mais c'est quelque chose à garder à l'esprit.
Nzall
@Nzall Je n'ai aucun problème à croire que cela pourrait le faire, mais je blâmerais Microsoft, pas mon code. Tout ce que je fais, c'est appeler plusieurs fois un sous-programme dans le fichier de commandes. Et je n'en exécute jamais plus d'un à la fois: chaque sous-programme s'exécute jusqu'à la fin, exécutant un seul processus à la fois. Combien de mémoire parlons-nous d'être utilisé?
trlkly
@trlkly À un moment donné, il est passé à 2 Go, même si j'avais une assez grande quantité de dossiers et de sous-dossiers, environ 75 000 fichiers et des milliers de dossiers. Quelques instants après, il est retombé à environ 8-900 Mo. Il y avait cependant beaucoup de fichiers en double. J'étais en train d'aplatir 12 copies d'une bibliothèque Javascript de 7 500 fichiers afin de pouvoir tester comment certains logiciels géreraient un dossier contenant des dizaines de milliers de fichiers.
Nzall
@Nzall C'est incroyablement bizarre pour moi. Rien du script ne devrait faire cela. C'est un sous-programme qui réutilise une seule variable pour incrémenter le fichier. Je devrais peut-être demander ce qui pourrait provoquer une telle utilisation de la mémoire sur SO ou quelque chose.
trlkly
9

Vous pouvez aplatir dans l'Explorateur Windows en accédant au dossier que vous souhaitez aplatir et en recherchant pour System.Kind:<>folderexclure les dossiers des résultats.

Vous pouvez ensuite sélectionner tous les fichiers avec CTRL + A et les copier et les coller dans un nouveau dossier. Notez que l'Explorateur Windows vous demandera comment gérer les noms de fichiers en double.

entrez la description de l'image ici

Matthieu
la source
1
notez que pour que cela fonctionne, vous devez taper "dossier" dans la traduction localisée correspondante (par exemple, en italien est System.Kind:<>cartella)
JohnKiller
0

Ce genre de chose est facile avec un shell Unix. Voici ce que vous pourriez faire avec mon propre shell Hamilton C (y compris la version gratuite) . Vous pouvez faire quelque chose de très similaire avec Cygwin bash.

mv *\* .

Si votre répertoire est vraiment énorme, il est possible que le caractère générique soit placé dans une ligne de commande trop longue pour que Windows puisse passer à un processus enfant. (L' appel Windows CreateProcess limite la liste d'arguments à 32 Ko de caractères Unicode.) Mais le shell C n'a pas de limite en interne, vous pouvez donc parcourir toute la liste de cette façon:

foreach i ( *\* )
   mv $i .
end

Pour le point de @ MarkAllen ci-dessus, ce genre suppose qu'il n'y a pas de noms en double. Si tel est le cas, les dernières copies de la liste remplaceront les plus anciennes. Si cela vous inquiète, vous pouvez parcourir les fichiers, en mvles utilisant uniquement si vous n'écrasez pas. L' :topérateur est l' opérateur de queue . L' -eopérateur est le fichier existe test .

foreach i ( *\* )
   if ( -e $i:t ) then
      echo -2 $i not moved because it already exists
   else
      mv $i .
   end
end

Cela laisse toujours les répertoires vides, ce que vous ne voulez peut-être pas après qu'ils ont été vidés. Cela pourrait être la prochaine itération si cela importait.

Nicole Hamilton
la source
Utilisation de cygwin> mv *. mv: ne peut pas stat `* ': aucun fichier ou répertoire
Plus de cinq
À Cygwin bash, mv */* .ça marche pour moi.
Nicole Hamilton
3
Certaines personnes sont tellement fixes dans UNIXism ... Si vous voulez vraiment faire des scripts dans Windows 7, il y a PowerShell, vous n'avez pas besoin d'un simulateur bash faux comme Cygwin.
Vous n'avez même pas besoin de PowerShell. La ligne de commande régulière existe toujours et peut faire les mêmes choses. Voir ma réponse ci-dessous.
trlkly