6

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

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

5 ответов5

10

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

ОДИН ЛАЙНЕР

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

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

2

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

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

2

Нашел это на 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
1

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

Файл 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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .