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

32878
Matt Rogish

У меня есть сервер Windows Server 2003, который имеет целую кучу имен файлов, которые необходимо переименовать. По сути, мне просто нужно -заменить все (дефисы) на _(подчеркивание), независимо от того, где они находятся в имени файла. Предположим, что нет дубликатов.

Я могу сделать это на своем Mac с помощью небольшого сценария, но файлы слишком большие и сумасшедшие, чтобы передать их на мой Mac, переименовать, а затем вернуться на сервер. Возможно ли сделать это в командной строке Windows, не загружая переименователь или дополнительное программное обеспечение?

6
Вы можете просто переименовать их с другого компьютера через SMB. Не нужно копировать файлы только для изменения имени. Joey 14 лет назад 2

5 ответов на вопрос

10
Murdoch Ripper

Из командной строки - при условии, что все ваши файлы находятся в одном каталоге:

ОДИН ЛАЙНЕР

for /f "tokens=* delims= " %i in ('dir /b "*.txt"') do Set LIST=%i& set LIST | ren "%~fi" "%LIST:-=_%"

Имейте в виду, что это один выстрел на окно командной строки. Это означает, что если вы отмените это по какой-либо причине, вам нужно будет открыть другую командную строку и запустить снова.

Я пытался найти метод for / f для него, и мой мозг просочился через мои уши задолго до того, как я нашел решение. Взломать немного кода, молодец! AdamV 14 лет назад 2
Спасибо Адам. Это заняло у меня около недели, чтобы понять, как это сделать. Единственная причина, по которой я это сделал, была из-за командной строки кунг-фу! (Http://blog.commandlinekungfu.com/2009/05/not-ready-yet-episode-replacing-strings.html) Murdoch Ripper 14 лет назад 0
Ницца!!! У меня есть одна строка на моем Mac, которую я использовал, надеялся на одну в Windows. ХОРОШАЯ РАБОТА! Matt Rogish 14 лет назад 0
Я отредактировал его для небольшой коррекции (у меня были проблемы с пробелами в именах файлов) Daniel Mošmondor 12 лет назад 0
это работает и для папок? Sun 11 лет назад 0
Да, это так. Просто измените следующий код с "('dir / b" * .txt "')" на "('dir / ad')". Murdoch Ripper 10 лет назад 0
2
Matt Rogish

Нашел это на stackoverflow:

https://stackoverflow.com/questions/261515/batch-file-script-to-remove-special-characters-from-filenames-windows

Set fso = CreateObject("Scripting.FileSystemObject") Set re = New RegExp  re.Pattern = "[-]" ' put all characters that you want to strip inside the brackets' re.IgnoreCase = True re.Global = True  If WScript.Arguments.Unnamed.Count = 1 Then If fso.FolderExists(WScript.Arguments.Unnamed(0)) Then Recurse fso.GetFolder(WScript.Arguments.Unnamed(0)) Else WScript.Echo "Folder not found." End If Else WScript.Echo "Please give folder name as argument 1." End If   Sub Recurse(f) For Each sf In f.SubFolders Recurse sf WScript.Echo sf.Name, " -> ", re.Replace(sf.Name, "_") sf.Name = re.Replace(sf.Name, "_") Next For Each sf In f.Files WScript.Echo sf.Name, " -> ", re.Replace(sf.Name, "_")  If sf.Name <> re.Replace(sf.Name, "_" ) Then sf.Name = re.Replace(sf.Name, "_") End If Next End Sub 
кажется, что это скорее удаление, чем замена, хотя я уверен, что это может быть исправлено достаточно легко AdamV 14 лет назад 1
пост, на который вы ссылаетесь, содержит инструкции по запуску скрипта, было бы полезно, если бы вы включили эту информацию в свой ответ. quack quixote 14 лет назад 0
2
Eric Leschinski

Пакетный файл для замены одного символа в имени файла другим символом

Подумайте об использовании бесплатного приложения с графическим интерфейсом, чтобы держать вас за руку: http://www.bulkrenameutility.co.uk/Main_Intro.php

Если вы должны сделать это сами с командным файлом, будьте супер осторожны! Пакетные сценарии не имеют кнопки «отменить». Если вы выполняете свой скрипт bat, который рекурсивно применяется ко всем файлам, находящимся где-то вроде C:, вы просто переименовали каждый файл на вашем компьютере, и он немедленно перестанет работать и не сможет загрузиться. Вам придется сделать полную переустановку ОС. Всегда имейте резервную копию!

Сначала вам нужно решить, хотите ли вы, чтобы пакетный файл работал с одним файлом? Работать со всеми файлами в каталоге? Или сделать это рекурсивно (все файлы / папки в каталоге). Вот несколько указателей:

Пакетный файл для замены всех подчеркиваний _на буквы Mдля всех файлов в текущем каталоге

Поместите это в командный файл с именем change_underscores_in_this_directory.bat

@echo off setlocal enabledelayedexpansion for %%a in (*_*) do ( set file=%%a ren "!file!" "!file:_=M!" ) 

Выполните его, и все файлы в этом каталоге с подчеркиванием будут заменены на «М».

Используйте пакетный файл, чтобы заменить пробелы ничем (удаляя пробелы):

https://stackoverflow.com/questions/11270453/how-to-remove-spaces-from-file-names-in-bulk

Используйте пакетный файл для замены пробелов подчеркиванием, рекурсивно:

https://stackoverflow.com/questions/1613644/how-to-replace-names-recursively-via-windows-batch-operation

Работает отлично! Marco Demaio 9 лет назад 0
1
Vlad

Другим решением будет использование двух командных файлов.

Файл 1: run_rn.bat:

forfiles /m "*.log" /c " cmd /c rn @file" 

Файл 2: rn.bat:

set LIST1=%1 set LIST2=%LIST1:_=;% ren %LIST1% %LIST2% 

Пакетные файлы должны находиться в том же каталоге, что и файлы, которые вы хотите изменить.

0
AdamV

У 12noon есть БЕСПЛАТНАЯ утилита для массового переименования файлов с полной поддержкой регулярных выражений, что довольно круто. Информационная страница "Name Twister" со ссылками для скачивания

Я не использовал это в гневе, но использовал другие их приложения (особенно дисплей чейнджер) и был действительно счастлив.

Похожие вопросы