Jakiego polecenia mogę użyć do rekurencyjnej zmiany nazwy lub przeniesienia pliku w systemie Windows?

40

Jakie polecenie w systemie Windows emuluje rekursywne polecenie przenoszenia / zmiany nazwy z systemu Unix?

javamonkey79
źródło

Odpowiedzi:

56

Użyj forpolecenia XP . Na przykład z wiersza poleceń ( %%xzamiast tego użyj pliku wsadowego ), aby wykonać ruch rekurencyjny:

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

Aby wykonać rekurencyjną zmianę nazwy:

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

Przykładowa partia:

for /r "< DIR >" %%x in (*.c) do ren "%%x" *.cpp
Rob Kam
źródło
To zdecydowanie najprostsze rozwiązanie, wielkie dzięki!
javamonkey79,
Aby użyć polecenia FOR w programie wsadowym, podaj %% zmienną zamiast% zmiennej.
Tom Robinson,
Jak to zrobić w innym katalogu źródłowym bez cwd'ing?
Evan Carroll,
Próbuję tego użyć, aby zastąpić każdy plik „% 20” w każdym pliku zwykłym „”. Jak mam to zrobic?
Mike Warren,
@RobKam, faktycznie idę do pętli for do pracy, ale zmieniam nazwę tylko 1 pliku .. jak ustawić dziką kartę, aby rozpoznała wiele rozszerzeń plików będzie *.*działać?
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
źródło
2

Właśnie uruchomiłem mały przykład w moim pudełku Windows XP SP2 z poleceniem move i zadziałało. Wszystkie pliki i katalogi zostały przeniesione ze źródła do miejsca docelowego. source i dest to nazwy katalogów.

przenieś źródło dest
ver

Microsoft Windows XP [wersja 5.1.2600]
ruszaj się /?

Przenosi pliki i zmienia nazwy plików i katalogów.

Aby przenieść jeden lub więcej plików:
MOVE [/ Y | / -Y] [dysk:] [ścieżka] nazwa_pliku1 [, ...] miejsce docelowe

Aby zmienić nazwę katalogu:
MOVE [/ Y | / -Y] [dysk:] [ścieżka] nazwa_katalogu1 nazwa_katalogu2

  [dysk:] [ścieżka] nazwa_pliku1 Określa lokalizację i nazwę pliku
                          lub pliki, które chcesz przenieść.
  miejsce docelowe Określa nową lokalizację pliku. przeznaczenie
                          może składać się z litery dysku i dwukropka, a
                          nazwa katalogu lub kombinacja. Jeśli się przeprowadzasz
                          tylko jeden plik, możesz także podać nazwę pliku, jeśli
                          chcesz zmienić nazwę pliku podczas jego przenoszenia.
  [dysk:] [ścieżka] nazwa_katalogu1 Określa katalog, którego nazwę chcesz zmienić.
  dirname2 Określa nową nazwę katalogu.

  / Y Pomija monit o potwierdzenie, że chcesz
                          zastąp istniejący plik docelowy.
  / -Y Powoduje monitowanie o potwierdzenie zamiaru zastąpienia
                          istniejący plik docelowy.

Przełącznik / Y może być obecny w zmiennej środowiskowej COPYCMD.
Można to zastąpić opcją / -Y w wierszu polecenia. Domyślnie jest
wyświetlać monit o zastąpienie, chyba że wykonywane jest polecenie MOVE
w skrypcie wsadowym.
Jorge Ferreira
źródło
Naprawdę szukam rekurencyjnej zmiany nazwy, przepraszam, że uwzględniłem ten ruch jako część pytania.
javamonkey79
1

Wbudowane polecenie XCOPY jest zamknięte. Zrobi kopię rekurencyjną, ale nie sądzę, że obsługuje zmianę nazwy.


źródło
1
nie zapominaj, że xcopy domyślnie ignoruje ukryte pliki.
Richard Harrison
1
for /r %%x in (%1) do ren "%%x" %2

zmieni to rekurencyjnie nazwę pliku :-)

zapisz w pliku podaj 2 argumenty od rozszerzenia i do rozszerzenia.

np. nazwa pliku to komenda test.bat: test * .avi * .bmp

zmienia nazwy wszystkich plików z rozszerzeniem avi na bmp (we wszystkich podfolderach :))

Uwaga: To jest korekta dla postu, który odpowiedział 26 października o 13:20 przez Roba Kam. Dał za

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

gdzie jak to powinno mieć %% zamiast %


źródło
%% jest potrzebny tylko dla plików wsadowych.
paradroid
1

Stworzyłem skrypt VB, który będzie wyszukiwał i zamieniał nazwy katalogów ... Mam też wersję plików, jednak myślę, że to wystarczy, aby zacząć od własnego skryptu. Używam tego skryptu, mam fileandreplacedirs.vbsi umieszczam go w tym samym folderze, co foldery, których nazwę chcę zmienić. Ponadto niekoniecznie musi się ponownie pojawiać w folderze, ale może zostać zmodyfikowany

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
źródło
0

Użyj prostej komendy DOS.

  1. cd do katalogu źródłowego, w którym chcesz rekursywnie zmieniać nazwy rozszerzeń plików.

  2. Wpisz to polecenie:

    ren *.[CurrentFileExtension] *.[DesiredFileExtension]
    
Gafel
źródło
1
Działa to dobrze dla cwd, ale nie dla podkatalogów, dlatego nie jest rekurencyjne. Dziękuję ci jednak :)
javamonkey79,
0

Dodałem, if existaby uniknąć powrotu błędów (ma to znaczenie w Jenkins, więc nie psuje kompilacji), gdy plik nie istnieje w każdym folderze:

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

Aby wykonać rekurencyjną zmianę nazwy:

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

Przykładowa partia:

for /r "< DIR >" %%x in (*.c) do if exist "%%x" ren "%%x" *.cpp
Akira Yamamoto
źródło
1
Zamiast tworzyć nową odpowiedź, naprawdę powinieneś po prostu edytować odpowiedź, którą dodałeś.
LostBalloon,
0

PowerShell jest twoim przyjacielem. Nie potrzeba plików wsadowych ani skryptów. Na przykład, aby rekurencyjnie zmienić nazwę wszystkich plików .tiff na .tif w zdalnym katalogu, możesz uruchomić następującą komendę z Powershell:

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

Reba
źródło
0

Znalazłem ten skrypt Pythona, który również działa:

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)

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

Dodałem Python do mojej ścieżki i umieściłem powyższy skrypt Pythona w folderze „utils”. Następnie utworzyłem ten prosty skrypt wsadowy, aby go uruchomić: rn.bat:

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

Zaktualizowałem również powyższy skrypt Pythona, aby pobierał argumenty z wiersza poleceń. 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)

Wreszcie wszystko, co musisz teraz zrobić, to coś takiego:

>rn . .foo .bar

lub

>rn \ .exe .txt

Baw się dobrze z drugim :)

javamonkey79
źródło