Какую команду можно использовать для рекурсивного переименования или перемещения файла в Windows?

40

Какая команда в Windows эмулирует команду рекурсивного перемещения / переименования из Unix?

javamonkey79
источник

Ответы:

56

Используйте forкоманду XP . Например, из командной строки ( %%xвместо этого используйте командный файл ) для рекурсивного перемещения выполните:

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

Чтобы сделать рекурсивное переименование, выполните:

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

Пример партии:

for /r "< DIR >" %%x in (*.c) do ren "%%x" *.cpp
Роб Кам
источник
Это, безусловно, самое простое решение, большое спасибо!
javamonkey79
Чтобы использовать команду FOR в пакетной программе, укажите %% переменную вместо% variable.
Том Робинсон
Как вы делаете это в другой исходный каталог без cwd'ing?
Эван Кэрролл
Я пытаюсь использовать это, чтобы заменить каждый файл "% 20" в каждом файле простым "". Как мне это сделать?
Майк Уоррен
@RobKam, я на самом деле работаю с циклом for, но переименовываю только 1 файл. Как настроить подстановочный знак для распознавания нескольких расширений файлов *.*?
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

Я просто запустил небольшой пример в моем Windows XP SP2 с командой move, и это сработало. Все файлы и каталоги были перемещены из источника в dest. source и dest - это имена каталогов.

переместить источник Dest
вер

Microsoft Windows XP [Версия 5.1.2600]
переехать /?

Перемещает файлы и переименовывает файлы и каталоги.

Чтобы переместить один или несколько файлов:
ДВИЖЕНИЕ / -Y] [диск:] [путь] имя_файла1 [, ...] место назначения

Чтобы переименовать каталог:
ДВИЖЕНИЕ / -Y] [диск:] [путь] dirname1 dirname2

  [диск:] [путь] имя_файла1 Указывает расположение и имя файла
                          или файлы, которые вы хотите переместить.
  назначение Указывает новое местоположение файла. Назначения
                          может состоять из буквы диска и двоеточия,
                          имя каталога или их комбинация. Если вы двигаетесь
                          только один файл, вы также можете включить имя файла, если
                          Вы хотите переименовать файл при его перемещении.
  [диск:] [путь] dirname1 Указывает каталог, который вы хотите переименовать.
  dirname2 Определяет новое имя каталога.

  / Y Подавляет запрос на подтверждение, что вы хотите
                          перезаписать существующий файл назначения.
  / -Y Вызывает запрос на подтверждение, что вы хотите перезаписать
                          существующий файл назначения.

Параметр / Y может присутствовать в переменной среды COPYCMD.
Это может быть переопределено с / -Y в командной строке. По умолчанию
запрашивать перезапись, если команда MOVE не выполняется из
в пакетном скрипте.
Хорхе Феррейра
источник
Я действительно ищу рекурсивное переименование, извините, я включил этот шаг как часть вопроса.
javamonkey79
1

Встроенная команда XCOPY близка. Это сделает рекурсивную копию, но я не думаю, что она поддерживает переименование.


источник
1
не забывайте, что xcopy по умолчанию будет игнорировать скрытые файлы.
Ричард Харрисон
1
for /r %%x in (%1) do ren "%%x" %2

это будет рекурсивно переименовывать файл :-)

сохранить в файл, дать 2 аргумента от расширения и до расширения.

пример: имя файла test.bat команда: test * .avi * .bmp

переименовывает все файлы с расширением avi в bmp (во всех подпапках :))

Примечание: это исправление для поста, на который ответил Роб Кэм 26 октября в 13:20. Он дал для

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

где, как это должно быть, %% вместо %


источник
%% нужен только для пакетных файлов.
Парадроид 30.10.10
1

Я создал VB Script, который будет выполнять поиск и замену имен каталогов ... У меня тоже есть версия файлов, но я думаю, что этого достаточно, чтобы вы начали работать со своим собственным сценарием. То, как я использую этот скрипт, это то, что у меня есть fileandreplacedirs.vbs, и я помещаю его в ту же папку, что и папки, которые хочу переименовать Кроме того, он не обязательно вернется в папку, но может с небольшой модификацией

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

Используйте простую команду DOS.

  1. Перейдите в исходный каталог, где вы хотите рекурсивно переименовать расширения файла.

  2. Введите эту команду:

    ren *.[CurrentFileExtension] *.[DesiredFileExtension]
    
багор
источник
1
Это прекрасно работает для cwd, но не для подкаталогов, поэтому не является рекурсивным. Спасибо, хотя :)
javamonkey79
0

Я добавил, if existчтобы избежать ошибок (это имеет значение в Jenkins, поэтому не нарушает сборку), когда файл не существует в каждой папке:

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

Чтобы сделать рекурсивное переименование, выполните:

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

Пример партии:

for /r "< DIR >" %%x in (*.c) do if exist "%%x" ren "%%x" *.cpp
Акира Ямамото
источник
1
Вместо того, чтобы создавать новый ответ, вам действительно нужно просто отредактировать ответ, к которому вы добавили.
LostBalloon
0

Powershell - твой друг. Пакетные файлы или сценарии не нужны. Например, чтобы рекурсивно переименовать все файлы .tiff в .tif в удаленном каталоге, вы можете запустить следующую команду из Powershell:

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

Reba
источник
0

Я нашел этот скрипт Python, который также работает:

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)

По адресу: http://gomputor.wordpress.com/2008/09/29/change-the-extension-of-multiple-files-in-a-chosen-directory-with-python/

Я добавил Python к своему пути и поместил скрипт Python выше в папку 'utils'. Затем я создал этот простой пакетный скрипт для его запуска: rn.bat:

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

Я также обновил скрипт python выше, чтобы взять его аргументы из командной строки. 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)

Наконец, все, что нужно сделать сейчас, это что-то вроде этого:

>rn . .foo .bar

или

>rn \ .exe .txt

Удачи со вторым :)

javamonkey79
источник