Quale comando posso usare per rinominare in modo ricorsivo o spostare un file in Windows?


Risposte:


56

Usa il forcomando di XP . Ad esempio dalla riga di comando (in un file batch utilizzare %%xinvece) per eseguire uno spostamento ricorsivo:

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

Per fare una ridenominazione ricorsiva, fare:

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

Lotto di esempio:

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

Questa è di gran lunga la soluzione più semplice, grazie mille!
javamonkey79,

Per utilizzare il comando FOR in un programma batch, specificare la variabile %% anziché la variabile%.
Tom Robinson,

Come si fa a farlo in una directory di origine diversa senza cwd'ing?
Evan Carroll,

Sto cercando di utilizzare questo per sostituire ogni file '% 20' in ogni file con un semplice ''. Come faccio a fare questo?
Mike Warren,

@RobKam, in realtà eseguo il ciclo for per funzionare ma rinomina solo 1 file .. come posso impostare il carattere jolly per riconoscere che funzioneranno più estensioni di file *.*?
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).

2

Ho appena eseguito un piccolo esempio nella mia casella di Windows XP SP2 con il comando move e ha funzionato. Tutti i file e le directory sono stati spostati dal sorgente al dest. source e dest sono nomi di directory.

sposta sorgente dest
ver

Microsoft Windows XP [Versione 5.1.2600]
mossa /?

Sposta i file e rinomina file e directory.

Per spostare uno o più file:
SPOSTA [/ Y | / -Y] [unità:] [percorso] nomefile1 [, ...] destinazione

Per rinominare una directory:
SPOSTA [/ Y | / -Y] [drive:] [percorso] dirname1 dirname2

  [unità:] [percorso] nomefile1 Specifica la posizione e il nome del file
                          o file che si desidera spostare.
  destinazione Specifica la nuova posizione del file. Destinazione
                          può essere costituito da una lettera di unità e due punti, a
                          nome della directory o una combinazione. Se ti stai muovendo
                          solo un file, puoi anche includere un nome file se
                          vuoi rinominare il file quando lo sposti.
  [unità:] [percorso] dirname1 Specifica la directory che si desidera rinominare.
  dirname2 Specifica il nuovo nome della directory.

  / Y Elimina la richiesta di conferma
                          sovrascrivere un file di destinazione esistente.
  / -Y Fa sì che venga richiesto di confermare la sovrascrittura
                          un file di destinazione esistente.

L'opzione / Y può essere presente nella variabile d'ambiente COPYCMD.
Questo può essere sovrascritto con / -Y sulla riga di comando. L'impostazione predefinita è
per richiedere la sovrascrittura a meno che non venga eseguito il comando MOVE
all'interno di uno script batch.

Sto davvero cercando una ridenominazione ricorsiva, mi dispiace di aver incluso la mossa come parte della domanda.
javamonkey79,

1

Il comando XCOPY integrato è vicino. Farà una copia ricorsiva, ma non credo che supporti la ridenominazione.


1
non dimenticare che xcopy ignorerà i file nascosti per impostazione predefinita.
Richard Harrison,

1
for /r %%x in (%1) do ren "%%x" %2

questo rinominerà il file in modo ricorsivo :-)

salvare in un file dare 2 argomenti dall'estensione e all'estensione.

es: il nome del file è comando test.bat: test * .avi * .bmp

rinomina tutti i file con estensione avi in ​​bmp (in tutte le sottocartelle :))

Nota: questa è la correzione per il post con risposta il 26 ottobre alle 13:20 di Rob Kam. Ha dato per

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

dove come shud ha %% invece di %


%% è necessario solo per i file batch.
paradroid



1

Ho creato uno script VB che eseguirà una ricerca e sostituirà i nomi di directory ... Ho anche una versione di file, tuttavia, penso che questo sia sufficiente per iniziare con il tuo script. Il modo in cui utilizzo questo script è che ne ho uno fileandreplacedirs.vbse lo inserisco nella stessa cartella delle cartelle che voglio rinominare. Inoltre, non si ricorre necessariamente alla cartella, ma potrebbe con una piccola modifica

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

0

Utilizzare un semplice comando DOS.

  1. cd nella directory di origine in cui si desidera rinominare le estensioni dei file in modo ricorsivo.

  2. Digita questo comando:

    ren *.[CurrentFileExtension] *.[DesiredFileExtension]
    

1
Funziona bene per la CWD, ma non per le sottodirectory, quindi non è ricorsivo. Grazie comunque :)
javamonkey79,

0

Ho aggiunto if existper evitare ritorni di errori (è importante in Jenkins, quindi non rompe una build) quando il file non esiste in ogni cartella:

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

Per fare una ridenominazione ricorsiva, fare:

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

Lotto di esempio:

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

1
Invece di creare una nuova risposta, devi semplicemente modificare la risposta a cui hai aggiunto.
LostBalloon,

0

Powershell è tuo amico. Nessun file batch o script necessari. Ad esempio, per rinominare in modo ricorsivo tutti i file .tiff in .tif in una directory remota, è possibile eseguire il seguente comando da Powershell:

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


0

Ho trovato questo script Python che funziona anche:

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)

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

Ho aggiunto Python al mio percorso e ho inserito lo script Python sopra in una cartella 'utils'. Ho quindi creato questo semplice script batch per eseguirlo: rn.bat:

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

Ho anche aggiornato lo script Python sopra per prendere i suoi argomenti dalla riga di comando. 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)

Finalmente tutto ciò che bisogna fare ora è qualcosa del genere:

>rn . .foo .bar

o

>rn \ .exe .txt

Divertiti con il secondo :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.