Mit welchem ​​Befehl kann ich eine Datei in Windows rekursiv umbenennen oder verschieben?

40

Welcher Befehl in Windows emuliert den rekursiven Befehl zum Verschieben / Umbenennen von Unix?

javamonkey79
quelle

Antworten:

56

Verwenden Sie den forBefehl von XP . Zum Beispiel über die Befehlszeile (in einer Batch-Datei verwenden Sie %%xstattdessen), um eine rekursive Verschiebung durchzuführen, gehen Sie wie folgt vor :

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

So führen Sie eine rekursive Umbenennung durch:

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

Beispielcharge:

for /r "< DIR >" %%x in (*.c) do ren "%%x" *.cpp
Rob Kam
quelle
Dies ist bei weitem die einfachste Lösung, vielen Dank!
Javamonkey79
Geben Sie %% variable anstelle von% variable an, um den Befehl FOR in einem Stapelverarbeitungsprogramm zu verwenden.
Tom Robinson
Wie machst du das in einem anderen Quellverzeichnis ohne Cwd'ing?
Evan Carroll
Ich versuche, dies zu verwenden, um jede '% 20'-Datei in jeder Datei durch ein einfaches' 'zu ersetzen. Wie mache ich das?
Mike Warren
@RobKam, ich gehe eigentlich zur for-Schleife, benenne aber nur 1 Datei um. Wie setze ich den Platzhalter, um zu erkennen, dass mehrere Dateierweiterungen *.*funktionieren?
DJ KRAZE
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
quelle
2

Ich habe gerade ein kleines Beispiel in meiner Windows XP SP2-Box mit dem Befehl move ausgeführt und es hat funktioniert. Alle Dateien und Verzeichnisse wurden von der Quelle zum Ziel verschoben. source und dest sind Verzeichnisnamen.

Quellenziel verschieben
ver

Microsoft Windows XP [Version 5.1.2600]
Bewegung /?

Verschiebt Dateien und benennt Dateien und Verzeichnisse um.

So verschieben Sie eine oder mehrere Dateien:
MOVE [/ Y | / -Y] [Laufwerk:] [Pfad] Dateiname1 [, ...] Ziel

So benennen Sie ein Verzeichnis um:
MOVE [/ Y | / -Y] [Laufwerk:] [Pfad] Verzeichnisname1 Verzeichnisname2

  [Laufwerk:] [Pfad] Dateiname1 Gibt den Speicherort und den Namen der Datei an
                          oder Dateien, die Sie verschieben möchten.
  Ziel Gibt den neuen Speicherort der Datei an. Ziel
                          kann aus einem Laufwerksbuchstaben und einem Doppelpunkt bestehen
                          Verzeichnisname oder eine Kombination. Wenn Sie umziehen
                          Nur eine Datei, Sie können auch einen Dateinamen einfügen, wenn
                          Sie möchten die Datei beim Verschieben umbenennen.
  [Laufwerk:] [Pfad] Verzeichnisname1 Gibt das Verzeichnis an, das Sie umbenennen möchten.
  dirname2 Gibt den neuen Namen des Verzeichnisses an.

  / Y Unterdrückt die Aufforderung zur Bestätigung
                          Überschreiben einer vorhandenen Zieldatei.
  / -Y Verursacht die Aufforderung zum Bestätigen des Überschreibens
                          eine vorhandene Zieldatei.

Der Schalter / Y kann in der Umgebungsvariablen COPYCMD vorhanden sein.
Dies kann mit / -Y in der Befehlszeile überschrieben werden. Standard ist
um zum Überschreiben aufzufordern, es sei denn, der Befehl MOVE wird ausgeführt von
innerhalb eines Batch-Skripts.
Jorge Ferreira
quelle
Ich bin wirklich auf der Suche nach rekursiven Umbenennungen. Tut mir leid, dass ich den Umzug als Teil der Frage aufgenommen habe.
Javamonkey79
1

Der integrierte XCOPY-Befehl ist geschlossen. Es wird eine rekursive Kopie erstellt, aber ich glaube nicht, dass es das Umbenennen unterstützt.


quelle
1
Vergessen Sie nicht, dass xcopy versteckte Dateien standardmäßig ignoriert.
Richard Harrison
1
for /r %%x in (%1) do ren "%%x" %2

das wird die Datei rekursiv umbenennen :-)

Speichern Sie in einer Datei und geben Sie 2 Argumente von der Erweiterung bis zur Erweiterung an.

Beispiel: Dateiname ist test.bat Befehl: test * .avi * .bmp

benennt alle Dateien mit der Endung avi in ​​bmp um (in allen Unterordnern :))

Hinweis: Dies ist eine Korrektur für den Beitrag, der am 26. Oktober um 13:20 von Rob Kam beantwortet wurde. Er gab für

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

wo wie es hieß %% statt %


quelle
Das %% wird nur für Batchdateien benötigt.
Paradroid
1

Ich habe ein VB-Skript erstellt, das nach Verzeichnisnamen sucht und diese ersetzt. Ich habe auch eine Dateiversion. Ich denke jedoch, dass dies ausreicht, um mit Ihrem eigenen Skript zu beginnen. Die Art und Weise, wie ich dieses Skript verwende, ist, dass ich ein habe fileandreplacedirs.vbsund es in denselben Ordner lege wie die Ordner, die ich umbenennen möchte. Außerdem muss es nicht unbedingt in den Ordner zurückkehren, könnte aber mit einer kleinen Modifikation

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
quelle
0

Verwenden Sie einen einfachen DOS-Befehl.

  1. Wechseln Sie in das Quellverzeichnis, in dem Sie die Dateierweiterungen rekursiv umbenennen möchten.

  2. Geben Sie diesen Befehl ein:

    ren *.[CurrentFileExtension] *.[DesiredFileExtension]
    
Gaff
quelle
1
Das funktioniert gut für die CWD, aber nicht für die Unterverzeichnisse, daher ist es nicht rekursiv. Vielen Dank :)
Javamonkey79
0

Ich habe hinzugefügt if exist, um Fehlerrückgaben zu vermeiden (dies ist in Jenkins wichtig, damit kein Build unterbrochen wird), wenn die Datei nicht in jedem Ordner vorhanden ist:

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

So führen Sie eine rekursive Umbenennung durch:

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

Beispielcharge:

for /r "< DIR >" %%x in (*.c) do if exist "%%x" ren "%%x" *.cpp
Akira Yamamoto
quelle
1
Anstatt eine neue Antwort zu erstellen, sollten Sie die Antwort, die Sie hinzugefügt haben, einfach bearbeiten.
LostBalloon
0

Powershell ist dein Freund. Keine Batch-Dateien oder Skripte erforderlich. Um beispielsweise alle .tiff-Dateien in einem Remote-Verzeichnis rekursiv in .tif umzubenennen, können Sie in Powershell den folgenden Befehl ausführen:

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

Reba
quelle
0

Ich habe dieses Python-Skript gefunden, das auch funktioniert:

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)

Gefunden unter: http://gomputor.wordpress.com/2008/09/29/change-the-extension-of-multiple-files-in-a-chosen-directory-with-python/

Ich habe meinem Pfad Python hinzugefügt und das Python-Skript oben in einen 'utils'-Ordner gestellt. Ich habe dann dieses einfache Batch-Skript erstellt, um es auszuführen: rn.bat:

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

Ich habe auch das Python-Skript oben aktualisiert, um die Argumente von der Befehlszeile zu übernehmen. 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)

Schließlich muss man jetzt nur noch so etwas tun:

>rn . .foo .bar

oder

>rn \ .exe .txt

Viel Spaß mit dem zweiten :)

javamonkey79
quelle