Existe-t-il un moyen de renommer par lots les fichiers en minuscule?


63

J'ai besoin d'un moyen de renommer tous les fichiers des dossiers et des sous-dossiers en minuscules.

J'aimerais savoir s'il existe un moyen de le faire en utilisant uniquement Windows (XP ou 7)


Windows ne fait pas la différence entre les petites majuscules et les majuscules, comme le fait Unix. peut-être que si vous disiez pourquoi vous en avez besoin, cela aiderait à résoudre le problème.
Rook

1
@ Idigas. Désolé, mais depuis NTFS, les noms de fichiers ont été sensibles à la casse. Voir support.microsoft.com/kb/100625
DaveParillo

Tout simplement génial. Prenez une mauvaise idée et diffusez-la davantage. Quel cauchemar de support technique lorsque quelqu'un envoie un fichier et qu'une grosse erreur du doigt signifie qu'il a envoyé "Answers.dat" et que le processus entrant s'attend à "answers.dat". Il n'y a aucune raison valable pour que ces deux noms soient considérés comme «différents».
David

2
@ David, par exemple, Java requiert des noms de fichiers sensibles à la casse. Cela peut causer beaucoup de problèmes sur les systèmes de fichiers non sensibles à la casse.
Arjan

10
Je sais que c'est vieux, mais je voulais clarifier une idée fausse ici. Alors que NTFS prend en charge la sensibilité à la casse, le système d’exploitation Windows ne fait pas de différence!
geo

Réponses:


122

Accédez au répertoire et exécutez la commande suivante:

for /f "Tokens=*" %f in ('dir /l/b/a-d') do (rename "%f" "%f")

Voici la ventilation au cas où quelqu'un voudrait modifier / améliorer:

  • for /f - Pour chaque ligne
  • "Tokens=*" - Traitez chaque élément de chaque ligne.
  • %f in (...)- %fest votre nom de variable pour chaque élément.
  • dir - répertorie tous les fichiers et sous-répertoires d'un répertoire.
  • /l- (paramètre pour dir) Utilise des minuscules.
  • /b- (paramètre pour dir) Utilise le format nu, uniquement les noms de fichier / répertoire, pas de taille, pas d'en-tête.
  • /a-d- (paramètre pour dir) Ne répertorie pas les répertoires . ( asignifie attribute, -représente notet dreprésente directory) .
  • rename "%f" "%f"- renommez le fichier avec son propre nom, qui est en fait mis en minuscule par la dircommande et la /lcombinaison.

7
Version récursive: for /f "Tokens=*" %f in ('dir /l/b/a-d/s') do (rename "%f" "%f")(ajouté / r à dir).
Sawny

3
C'est juste génial
Shir Gans

4
La version récursive ne fonctionnait pas pour moi - rename s'est plaint du fait que la commande était dans un format invalide. Il s'est avéré que le / s a ​​fait en sorte que le deuxième fichier soit répertorié comme chemin absolu et que l'extension de nom de fichier (% ~ nxf) m'ait donné le nom de fichier d'origine, en majuscule. J'ai fini par récurer manuellement.
Dogmatixed

3
C'est une très bonne réponse. au point, aucun programme externe requis, commande gentille et petite, aucun fichier de commandes compliqué-ness requis.
Jeff Wilbert

2
Peut-il être modifié pour changer les minuscules en majuscules?
Chucky

18

spacetornado Renamer est un programme Windows qui renomme des quantités massives de fichiers par lots. Vous pouvez rechercher et remplacer du texte, supprimer un certain nombre de caractères, changer la casse en majuscule, en majuscule ou en première lettre, et ajouter du texte au début ou à la fin (ajouter / prépendre) de chaque nom de fichier.

entrez la description de l'image ici


1
S'il vous plaît donnez-moi la raison du vote négatif?
Joe

5
Les gens expliquent rarement, malheureusement: /
Gnoupi

7
Je suppose que le vote négatif a été attribué au fait que le PO souhaitait une solution qui fonctionne sans logiciel supplémentaire. Et je suppose que le vote négatif n'a pas été expliqué parce que certaines personnes sont enclines à distribuer des votes négatifs à la vengeance.
InnaM

L'interface graphique est un peu géniale, mais elle fait mieux que plusieurs autres renommeurs que j'ai vus là-bas.
Jcollum

1
Il a fait ce qu'il a fait, quand j'avais besoin de renommer de manière récursive pour nettoyer des fichiers depuis un serveur FTP Linux ... cependant, je devais l'exécuter en tant qu'administrateur avant que cela fonctionne correctement. On se sent comme un vieux programme non maintenu :)
Nelson

12

Depuis Windows 7, vous pouvez utiliser PowerShell pour ces tâches.

Get-ChildItem "C:\path\to\folder" -recurse | 
  Where {-Not $_.PSIsContainer} | 
  Rename-Item -NewName {$_.FullName.ToLower()}

- Choisissez votre dossier racine
- tous les fichiers du dossier racine et des sous-dossiers sont renommés
- les noms de dossier sont exclus avec Where {-Not $_.PSIsContainer} |


7

Voici une solution de ligne de commande récursive appropriée utilisant uniquement les commandes natives cmd.exe qui fonctionnent réellement. Je crois que c'est la solution native la plus simple possible:

for /r %D in (.) do @for /f "eol=: delims=" %F in ('dir /l/b/a-d "%D"') do @ren "%D\%F" "%F"

Si vous souhaitez aller au-delà des commandes natives cmd.exe, une autre option est mon utilitaire de changement de nom d'expression régulière JREN.BAT qui prend en charge les options permettant de convertir les noms en majuscules ou en minuscules. C'est un script pur (hybride JScript / batch) qui s'exécute de manière native sur toute machine Windows à partir de XP - aucun fichier exe tiers n'est nécessaire. Une documentation complète est intégrée - accessible à partir de la ligne de commande via jren /?ou jren /??si vous souhaitez une sortie paginée.

Avec JREN, la solution récursive est aussi simple que:

jren "^" "" /s /l

1
Fonctionne très bien. Pour votre information, retirez le /a-dcommutateur et les noms des dossiers seront également minuscules.
Keith

J'ai essayé de l'enregistrer en tant que fichier de commandes et de l'exploiter dans system32 pour que je puisse l'exécuter à tout moment avec une seule commande. Résultats en ceci: " D"') was unexpected at this time.L'exécuter en tant que commande directe fonctionne bien, mais ne fonctionne tout simplement pas lorsqu'il est exécuté en tant que fichier de commandes. Je ne savais pas trop comment le faire fonctionner comme un fichier de commandes, mais je pensais que je me mettrais au courant.
Don Cullen

1
@DonCullen - La syntaxe standard veut que les pourcentages variables de FOR doivent être doublés lors de l'utilisation de FOR dans un script batch. Il %Dfaut donc changer à %%D, et %Fà %%Fsi vous mettez la commande dans un script batch.
Dbenham

Toujours apprendre quelque chose de nouveau tous les jours. Merci!
Don Cullen

6

Mon utilitaire préféré de changement de nom de fichier par lots est le WildRename de Cylog . Parmi beaucoup d'autres fonctionnalités, cela peut changer la casse des noms de fichiers. La meilleure chose à propos de WildRename est probablement qu'il supporte les expressions régulières!


CECI est la bonne application, après l'installation en 10 secondes. J'ai configuré et renommé de manière récursive un dossier distant (mappé pour plus de commodité).
Matteo Conta le

5

Version "récursive" de la réponse acceptée (qui fonctionne *)

for /f "Tokens=*" %f in ('cmd /c "echo %cd%& dir /l/b/ad/s"') do (for /f "Tokens=*" %g in ('dir /l/b/a-d "%f"') do (rename "%f"\"%g" "%g"))


La première boucle

for /f "Tokens=*" %f in ('cmd /c "echo %cd%& dir /l/b/ad/s"')

Obtient une liste des chemins absolus de tous les répertoires à l'intérieur du courant (y compris celui-ci):

C: \ Foo>

  • C: \ Foo \ TO.txt

  • C: \ Foo \ Bar \ LOWER.txt

  • C: \ Foo \ Bar \ Baz \ CASE.txt


La deuxième boucle

for /f "Tokens=*" %g in ('dir /l/b/a-d "%f"') do (rename "%f"\"%g" "%g")

Obtient une liste de tous les noms de fichiers (ou des noms de fichiers et de répertoires si vous retirez le /a-dcommutateur) à l'intérieur de chacun des chemins absolus trouvés par la première boucle et convertit le nom de ces fichiers en minuscules.

  • C: \ Foo \ TO.txt

  • C: \ Foo \ Bar \ LOWER.txt

  • C: \ Foo \ Bar \ Baz \ CASE.txt


* il faut deux boucles car le deuxième argument renamedoit être un nom de fichier et non un chemin absolu (comme celui obtenu par le /scommutateur).


Pourquoi avez-vous cmd /c "echo %cd%& dans le premier for? C'est complètement inutile.
DavidPostill

@DavidPostill echo %cd%est là pour ajouter le dossier actuel à la liste des chemins absolus . et cmd /cfait &en sorte de combiner les commandes. Je suis un noob total en ce qui concerne Windows Batch Scripting ; Si vous connaissez une meilleure solution, n'hésitez pas à améliorer la réponse!
wc.matteo

Excellent travail pour un noob. La vôtre était la première solution de ligne de commande native cmd.exe qui fonctionne, sauf qu’elle échoue lorsqu’un nom commence par un espace ou un point-virgule. La réponse acceptée pose le même problème. Voir ma réponse pour une réponse plus simple qui fonctionne également avec un espace ou un point-virgule.
dbenham

Cela peut-il être modifié pour convertir les plus bas en majuscules?
Rishav

3

Vous pouvez utiliser une stratégie de "remplacement de personnage" ...

set Name=%Name:A=a%
set Name=%Name:B=b%
set Name=%Name:C=c%

... et ainsi de suite pour les lettres AZ. Vous pourriez probablement l'implémenter sous la forme d'une boucle FOR.



1

De http://windowsitpro.com/articles/index.cfm?articleid=81612 :

En utilisant uniquement les commandes standard, j'ai scripté LwrCase.bat et LwrCase_Folder.bat pour renommer un nom de fichier en minuscule ou renommer tous les noms de fichier d’un dossier en minuscule.

Pour renommer un nom de fichier en minuscule, utilisez:

[call] LwrCase FullyQualifiedFileName

Où FullyQualifiedFileName est le nom de fichier complet à renommer.

Pour renommer tous les noms de fichiers d’un répertoire, utilisez:

[call] LwrCase_Folder FullyQualifiedDirectoryName [/S]

où FullyQualifiedDirectoryName est le chemin d'accès complet au dossier et où / S est un paramètre facultatif permettant de renommer les noms de fichiers de tous les sous-dossiers.

Remarque: LwrCase.bat utilise le commutateur / L de la commande DIR, qui renvoie les noms en minuscules.

LwrCase.bat contient:

@echo off
if {%1}=={} @echo Syntax: LwrCase FullyQualifiedFileName&goto :EOF
if not exist %1 @echo LwrCase - %1 NOT found.&goto :EOF
setlocal
for /f "Tokens=*" %%a in ('@echo %~a1') do (
 set file=%%a
)
if /i "%file:~0,1%" EQU "d" @echo LwrCase - %1 is NOT a file.&endlocal&goto :EOF
for /f "Tokens=*" %%f in ('dir %1 /L /b /a /a-d') do (
 Rename %1 "%%f"
)
endlocal

LwrCase_Folder.bat contient:

@echo off
if {%1}=={} @echo Syntax: LwrCase_Folder FullyQualifiedDirectoryName&goto :EOF
if not exist %1 @echo LwrCase_Folder - %1 NOT found.&goto :EOF
setlocal
for /f "Tokens=*" %%a in ('@echo %~a1') do (
 set folder=%%a
)
if /i "%folder:~0,1%" NEQ "d" @echo LwrCase_Folder - %1 is NOT a folder.&endlocal&goto :EOF
pushd %1
set sw=/B /A /A-D
if /i {%2}=={/S} set sw=%sw% %2
for /f "Tokens=*" %%f in ('dir %sw%') do (
 call LwrCase "%%f"
)
popd
endlocal

1

Le meilleur programme pour cela dans Windows est Bulk Rename Utility . C'est un outil de l'homme. Vous pouvez même utiliser regex pour renommer des fichiers et / ou des dossiers. Il a également une intégration shell (vous pouvez donc exécuter à partir d’explorateur avec un clic droit) ce qui est très agréable. Versions 64 bits et 32 ​​bits disponibles.


1

La réponse acceptée à cette question, par loftysnake , fonctionne pour le répertoire en cours mais ne recherche pas les sous-dossiers.  Sawny a suggéré une simple modification de la réponse de loftysnake pour la rendre récursive, mais cela ne fonctionne pas car, bien que la renamecommande vous permette de spécifier un lecteur et un chemin avec filename1 (la source), filename2 (la destination) ne doit être qu'un fichier. . Pour citer le /?message help ( ),

… Vous ne pouvez pas spécifier un nouveau lecteur ou chemin pour votre fichier de destination.

Mais movefonctionne où renamene fonctionne pas, vous pouvez donc renommer récursivement les fichiers en minuscule avec cette commande:

for /f "Tokens=*" %f in ('dir /l/b/a-d/s') do (move /y "%f" "%f")

car il s’avère que cela Movepeut faire face aux chemins de répertoire.

La commande ci-dessus fonctionne lorsqu'elle est directement saisie dans l'invite de commande ( CMD.EXE). Si vous voulez faire cela depuis un .BATfichier batch ( ), vous devez doubler les %caractères:

for /f "Tokens=*" %%f in ('dir /l/b/a-d/s') do (move /y "%%f" "%%f")

Et vous pouvez probablement laisser de côté les parenthèses et le /y et juste dire do move ….


Si vous envisagez de publier à nouveau des informations que d'autres ont déjà publiées, vous devez identifier le ou les auteurs d'origine et créer un lien vers leurs publications.
Scott

Désolé, mais je soulignais que cela movefonctionnait là où renamecela ne fonctionnait pas, et je pense que je suis le seul à avoir suggéré l’utilisation de la movecommande ici. J’ai simplement pris les suggestions de @loftysnake et de @sawny pour les améliorer un peu.
Adrian

C'est bizarre Je pensais que quelqu'un d'autre l'avait mentionné move, mais je ne le trouve pas maintenant.
Scott

0

Solution récursive Mettez ceci dans un fichier recursiverename.cmd.

for /f "Tokens=*" %%f in ('dir /l/b/a-d') do (rename "%%f" "%%f")
for /r /d %%x in (*) do (
    pushd "%%x"
    for /f "Tokens=*" %%f in ('dir /l/b/a-d') do (rename "%%f" "%%f")
    popd
)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.