Quelle commande puis-je utiliser pour renommer ou déplacer de manière récursive un fichier dans Windows?

40

Quelle commande sous Windows émule la commande récursive move / rename d’Unix?

javamonkey79
la source

Réponses:

56

Utilisez la forcommande de XP . Par exemple, à partir de la ligne de commande (utilisez %%xplutôt un fichier de commandes ) pour effectuer un déplacement récursif, procédez comme suit:

for /r %x in (foo) do move "%x" "drive:\path\bar"

Pour faire un changement de nom récursif, faites:

for /r %x in (*.c) do ren "%x" *.cpp

Exemple de lot:

for /r "< DIR >" %%x in (*.c) do ren "%%x" *.cpp
Rob Kam
la source
C'est de loin la solution la plus simple, merci beaucoup!
javamonkey79
Pour utiliser la commande FOR dans un programme de traitement par lots, spécifiez la variable %% au lieu de la variable%.
Tom Robinson
Comment faites-vous cela dans un répertoire source différent sans cwd'ing?
Evan Carroll
J'essaie de l'utiliser pour remplacer chaque fichier '% 20' dans chaque fichier par un ''. Comment puis-je faire cela?
Mike Warren
@ Robkam, je vais en fait la boucle for pour travailler mais renomme seulement 1 fichier .. comment puis-je définir le caractère générique pour reconnaître plusieurs extensions de fichiers *.*fonctionnera?
DJ KRAZE le
3

robocopy "C:\Source Folder" "C:\Destination Folder" /E /COPYALL /XJ


Description of parameters:
/E - copy subdirectories, including Empty ones (/S to exclude empty ones)
/COPYALL - COPY ALL file info (equivalent to /COPY:DATSOU)
/XJ - eXclude Junction points and symbolic links. (normally included by default).
Lance Miller
la source
2

Je viens d'exécuter un petit exemple dans ma boîte Windows XP SP2 avec la commande move et cela a fonctionné. Tous les fichiers et répertoires ont été déplacés de la source vers la destination. source et dest sont des noms de répertoire.

déplacer la destination source
ver

Microsoft Windows XP [Version 5.1.2600]
bouge toi /?

Déplace les fichiers et renomme les fichiers et les répertoires.

Pour déplacer un ou plusieurs fichiers:
DÉMÉNAGER [/ Y | / -Y] [lecteur:] [chemin] nom_fichier1 [, ...] destination

Pour renommer un répertoire:
DÉMÉNAGER [/ Y | / -Y] [lecteur:] [chemin] dirname1 dirname2

  [lecteur:] [chemin] nom_fichier1 Spécifie l'emplacement et le nom du fichier.
                          ou les fichiers que vous souhaitez déplacer.
  destination Spécifie le nouvel emplacement du fichier. Destination
                          peut consister en une lettre de lecteur et deux points, un
                          nom du répertoire ou une combinaison. Si vous déménagez
                          un seul fichier, vous pouvez également inclure un nom de fichier si
                          vous souhaitez renommer le fichier lorsque vous le déplacez.
  [lecteur:] [chemin] dirname1 Spécifie le répertoire que vous souhaitez renommer.
  dirname2 Spécifie le nouveau nom du répertoire.

  / Y Supprime l'invite pour confirmer que vous souhaitez
                          écraser un fichier de destination existant.
  / -Y Provoque l’incitation à confirmer que vous souhaitez écraser
                          un fichier de destination existant.

Le commutateur / Y peut être présent dans la variable d’environnement COPYCMD.
Cela peut être annulé avec / -Y sur la ligne de commande. La valeur par défaut est
pour inviter les écrasements à moins que la commande MOVE ne soit exécutée
dans un script batch.
Jorge Ferreira
la source
Je suis vraiment à la recherche d'un changement de nom récursif, désolé d'avoir inclus le déplacement dans la question.
javamonkey79
1

La commande XCOPY intégrée est fermée. Cela fera une copie récursive, mais je ne pense pas que cela supporte le changement de nom.


la source
1
N'oubliez pas que xcopy ignorera les fichiers cachés par défaut.
Richard Harrison
1
for /r %%x in (%1) do ren "%%x" %2

cela renommera le fichier récursivement :-)

enregistrer dans un fichier donne 2 arguments d’extension et d’extension.

ex: le nom du fichier est test.bat commande: test * .avi * .bmp

il renomme tous les fichiers avec l'extension avi en bmp (dans tous les sous-dossiers :))

Note: Ceci est une correction pour le message répondu le 26 octobre à 13h20 par Rob Kam. Il a donné pour

/r %x in (*.c) do ren "%x" *.cpp

où il devrait avoir %% au lieu de %


la source
Le %% est nécessaire uniquement pour les fichiers de commandes.
Parroïde
1

J'ai créé un script VB qui effectuera une recherche et remplacera les noms de répertoires ... J'ai aussi une version de fichier, mais je pense que cela suffit pour vous permettre de démarrer avec votre propre script. La façon dont j'utilise ce script est que j'ai fileandreplacedirs.vbs, et le place dans le même dossier que les dossiers que je veux renommer. En outre, il ne rentre pas nécessairement dans le dossier, mais pourrait avec un peu de modification

search1  = InputBox("Search for...", "", "")
replace1 = InputBox("replace with...", "", "")

Dim MyFile
MyFiles = GetFileArray(".")

For Each MyFile In MyFiles
    NewFilename = Replace(MyFile.Name, search1, replace1)
    If InStr( MyFile.Name, search1 ) Then MyFile.Name = NewFilename
Next

MsgBox "Done..."

function GetFileArray(ByVal vPath)
    'Get our objects...
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set Folder = FSO.Getfolder(vPath)
    Set Files = Folder.SubFolders

    'Resize the local array
    'Arrays are 0 based but Files collection is 1 based.
    if Files.count = 0 then
        GetFileArray = array()
        Exit Function
    Else
        Index = 0
        Redim FileList(Files.Count-1)
        For Each File In Files
            set FileList(Index) = File
            Index = Index + 1
        Next
        GetFileArray = FileList
    End If

    'Always good practice to explicitly release objects...
    Set FSO = Nothing
    Set Folder = Nothing
    Set Files = Nothing

End function
Roy Rico
la source
0

Utilisez une simple commande DOS.

  1. Allez dans le répertoire source où vous souhaitez renommer les extensions de fichier de manière récursive.

  2. Tapez cette commande:

    ren *.[CurrentFileExtension] *.[DesiredFileExtension]
    
Gaffe
la source
1
Cela fonctionne bien pour le cwd, mais pas les sous-répertoires, donc ce n'est pas récursif. Merci
quand
0

J'ai ajouté if existpour éviter les retours d'erreur (c'est important dans Jenkins pour que ça ne casse pas une construction) quand le fichier n'existe pas dans tous les dossiers:

for /r %x in (foo) do if exist "%x" move "%x" "drive:\path\bar"

Pour faire un changement de nom récursif, faites:

for /r %x in (*.c) do if exist "%x" ren "%x" *.cpp

Exemple de lot:

for /r "< DIR >" %%x in (*.c) do if exist "%%x" ren "%%x" *.cpp
Akira Yamamoto
la source
1
Au lieu de créer une nouvelle réponse, vous devez modifier simplement la réponse que vous avez ajoutée.
LostBalloon
0

Powershell est votre ami. Pas de fichiers de commandes ou de scripts nécessaires. Par exemple, pour renommer de manière récurrente tous les fichiers .tiff en .tif dans un répertoire distant, vous pouvez exécuter la commande suivante à partir de Powershell:

get-childitem "\\\servername\d$\path" -recurse -Include *.tiff | Rename-Item -NewName { $_.Name.replace(".tiff",".tif") }

Reba
la source
0

J'ai trouvé ce script en python qui fonctionne aussi:

for root, dirs, files in os.walk(cur_dir):  
    for filename in files:  
        file_ext = os.path.splitext(filename)[1]  
        if old_ext == file_ext:  
            oldname = os.path.join(root, filename)  
            newname = oldname.replace(old_ext, new_ext)  
            os.rename(oldname, newname)

Trouvé à l' adresse : http://gomputor.wordpress.com/2008/09/29/change-the-extension-of-multiple-files-in-a-chosen-directory-with-python/

J'ai ajouté Python à mon chemin et ai placé le script Python ci-dessus dans un dossier 'utils'. J'ai ensuite créé ce script batch simple pour l'exécuter: rn.bat:

python \utils\rn.py %1 %2 %3

J'ai également mis à jour le script python ci-dessus pour prendre ses arguments à partir de la ligne de commande. rn.py:

import sys
import os

cur_dir = sys.argv[1]
old_ext = sys.argv[2]
new_ext = sys.argv[3]

#print cur_dir, old_ext, new_ext
for root, dirs, files in os.walk(cur_dir):  
    for filename in files:  
        file_ext = os.path.splitext(filename)[1]

        if old_ext == file_ext:  
            oldname = os.path.join(root, filename)  
            newname = oldname.replace(old_ext, new_ext)  
            os.rename(oldname, newname)

Enfin, tout ce qu’il faut faire maintenant ressemble à ceci:

>rn . .foo .bar

ou

>rn \ .exe .txt

Amusez-vous avec le second :)

javamonkey79
la source