Какая команда в Windows эмулирует команду рекурсивного перемещения / переименования из Unix?
12 ответов
Используйте XP for
команды. Например, из командной строки (вместо пакетного файла используйте %%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
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).
Я просто запустил небольшой пример в моем Windows XP SP2 с командой move, и это сработало. Все файлы и каталоги были перемещены из источника в dest. source и dest - это имена каталогов.
move source dest
ver Microsoft Windows XP [Version 5.1.2600]
move /? Moves files and renames files and directories. To move one or more files: MOVE [/Y | /-Y] [drive:][path]filename1[,...] destination To rename a directory: MOVE [/Y | /-Y] [drive:][path]dirname1 dirname2 [drive:][path]filename1 Specifies the location and name of the file or files you want to move. destination Specifies the new location of the file. Destination can consist of a drive letter and colon, a directory name, or a combination. If you are moving only one file, you can also include a filename if you want to rename the file when you move it. [drive:][path]dirname1 Specifies the directory you want to rename. dirname2 Specifies the new name of the directory. /Y Suppresses prompting to confirm you want to overwrite an existing destination file. /-Y Causes prompting to confirm you want to overwrite an existing destination file. The switch /Y may be present in the COPYCMD environment variable. This may be overridden with /-Y on the command line. Default is to prompt on overwrites unless MOVE command is being executed from within a batch script.
Встроенная команда XCOPY близка. Он будет делать рекурсивную копию, но я не думаю, что он поддерживает переименование.
Я создал скрипт VB, который будет выполнять поиск и замену имен каталогов ... У меня тоже есть версия для файлов, но я думаю, что этого достаточно, чтобы вы начали работать со своим собственным сценарием. Я использую этот сценарий: у меня есть 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
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
где, как это должно быть, %% вместо %
Это работало лучше для меня:
FOR /R "C:\folder1\folder2\" %i in (.,*) DO MOVE /Y "%i" "C:\folder1\"
Источник: http://www.islamadel.com/index.php/notes/6-computer/10-windows-command-line
Есть порты Windows для большинства команд UNIX:
Я нашел этот скрипт 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)
Я добавил 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
Удачи со вторым :)
Используйте простую команду DOS.
Перейдите в исходный каталог, где вы хотите рекурсивно переименовать расширения файла.
Введите эту команду:
ren *.[CurrentFileExtension] *.[DesiredFileExtension]
Powershell - твой друг. Пакетные файлы или сценарии не нужны. Например, чтобы рекурсивно переименовать все файлы .tiff в .tif в удаленном каталоге, вы можете запустить следующую команду из Powershell:
get-childitem "\\\servername\d$\path" -recurse -Include *.tiff | Rename-Item -NewName {
$_.Name.replace(".tiff",".tif") }
Я добавил, 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