Renomear lote de vários arquivos [duplicado]

2

Temos vários arquivos com nomes de arquivo semelhantes aos abaixo:

Organizing_your_day_in_acute_care_-_Flash_(Medium)_-_20120516_12.04.02PM.mp4
Developing_a_Business_Plan_-_IT_Projects_-_Flash_(Medium)_-_20120529_09.39.09PM.mp4
GI_Medications_-_Flash_(Medium)_-_20120607_11.35.50AM.mp4
Effectiveness_and_Data_and_Information_Set_-_Flash_(Large)_-_20120208_02.41.28PM.mp4
Adult_Learning_-_Theory_-_Flash_(Medium)_-_20100519_05.25.02PM.mp4

O que eu gostaria de fazer é criar um script em lote para renomear esses arquivos para que todos os sublinhados sejam removidos e tudo após a string "_-_ Flash" ser removida, essencialmente deixando os arquivos assim:

Organizing your day in acute care.mp4
Developing a Business Plan - IT Projects.mp4
GI Medications.mp4
Effectiveness and Data and Information Set.mp4
Adult Learning - Theory.mp4

Qualquer ajuda seria muito apreciada.

    
por rj454me 03.09.2012 / 08:39

3 respostas

1

Este arquivo .bat deve funcionar, mas lembre-se de que, caso você tenha arquivos que não seguem o padrão de nome de arquivo fornecido, os resultados serão imprevisíveis:

setlocal EnableDelayedExpansion
FOR /F "usebackq delims==" %%i IN ('dir /b *.mp4') DO (
    set oldfilename=%%i
    set oldfilename=!oldfilename:^(=!
    set oldfilename=!oldfilename:^)=!
    set endbit=!oldfilename:*_-_Flash=_-_Flash!
    call set newfilename=%%oldfilename:!endbit!=%%
    set newfilename=!newfilename:_= !
    rename "%%i" "!newfilename!.mp4")
endlocal
    
por 03.09.2012 / 12:02
1

Pode ser mais fácil fazer isso no VBScript

Set fso = CreateObject("Scripting.FileSystemObject")
For Each f In fso.GetFolder(".")
  ext = LCase(fso.GetExtensionName(f))
  If ext = "mp4" Then
    f.Name = Replace(Left(s, InStr(s, "_-_Flash")-1), "_", " ") & "." & ext
  End If
Next

ou no PowerShell

Get-ChildItem -Filter *.mp4 | ForEach-Object {
  $newname = $_.Name -replace "_-_Flash.*(.mp4)", '$1'
  $newname = $newname -replace "_", " "
  Rename-Item $_.FullName $newname
}
    
por 03.09.2012 / 14:51
1

Como você está no Windows, você pode usar todo o poder do JScript + ActiveX para automatizar praticamente qualquer tarefa em JavaScript e, pessoalmente, acho que parece mais limpo.

Salve o seguinte em algum lugar como rename.js:

var shell = new ActiveXObject("Shell.Application")
var folder = shell.NameSpace("D:\1\test") // <--- your folder name here
// or interactive: var folder = shell.BrowseForFolder(0, "Select folder to clean-up", 0)
var items = folder.Items()
for (var idx = 0; idx < items.Count; idx++) {
   var file = items.Item(idx)
   var filename = file.Name
   var new_filename = filename.replace(/_\-_Flash_.*/, '').replace(/_/g, ' ')
   if (new_filename != filename) {
      file.Name = new_filename
      // You can uncomment next line if you run in console.
      // WScript.Echo(filename + ' -> ' + new_filename)
   }
}

E execute o arquivo wscript.exe (GUI) ou o cscript.exe (console).

    
por 03.09.2012 / 14:55