2010-07-28 1 views
3

Я восстановил некоторые документы Word с поврежденного жесткого диска с помощью программного обеспечения, называемого photorec. Проблема в том, что имена документов не могут быть восстановлены; они все переименованы в последовательность чисел. Есть более 2000 документов для сортировки, и мне было интересно, могу ли я переименовать их, используя какой-то автоматизированный процесс.Переименование документа Word и сохранение его имени с его первыми 10 буквами

Есть ли сценарий, который я мог бы использовать, чтобы найти первые 10 букв в документе и переименовать его с этим? Он должен был бы иметь возможность справляться с несколькими документами, имеющими одни и те же первые 10 букв, и поэтому не записывать документы с тем же именем. Кроме того, это должно было бы избежать переименования документа с незаконными символами (например, «?», «*», «/» И т. Д.)

У меня есть только немного опыта работы с Python, C и даже меньше с программированием bash в Linux, так что несите меня, если я не знаю точно, что я делаю, если мне нужно написать новый скрипт.

ответ

2

Документы Word хранятся в специальном формате, который помещает загрузку бинарного трещин в начало файла.

Простейшей задачей было бы сбить что-то в Python, который искал первую строку, начинающуюся с символов ASCII. Здесь вы идете:

#!/usr/bin/python 

import glob 
import os 

for file in glob.glob("*.doc"): 
    f = open(file, "rb") 
    new_name = "" 
    chars = 0 

    char = f.read(1) 
    while char != "": 
     if 0 < ord(char) < 128: 
      if ord("a") <= ord(char) <= ord("z") or ord("A") <= ord(char) <= ord("Z") or ord("0") <= ord(char) <= ord("9"): 
       new_name += char 
      else: 
       new_name += "_" 
      chars += 1 
      if chars == 100: 
       new_name = new_name[:20] + ".doc" 
       print "renaming " + file + " to " + new_name 
       f.close() 
       break; 
     else: 
      new_name = "" 
      chars = 0 
     char = f.read(1) 

    if new_name != "": 
     os.rename(file, new_name) 

Примечание: если вы хотите, чтобы шарик несколько каталогов вам нужно изменить Глоб линии соответственно. Кроме того, это не учитывает, существует ли файл, который вы пытаетесь переименовать, уже существует, поэтому, если у вас есть несколько документов с теми же самыми первыми символами, тогда вам нужно будет это обработать.

Я нашел первый фрагмент из 100 символов ASCII в строке (если вы ищете меньше, чем вы в итоге получаете ключевые слова doc и т. Д.), А затем использовали первые 20 из них, чтобы создать новое имя, заменив что-нибудь это не az AZ или 0-9 с подчеркиваниями, чтобы избежать проблем с именами файлов.

3

Как насчет VBScript? Вот набросок:

FolderName = "C: \ Docs \"

Set fs = CreateObject("Scripting.FileSystemObject") 

Set fldr = fs.GetFolder(Foldername) 

Set ws = CreateObject("Word.Application") 

For Each f In fldr.Files 
    If Left(f.name,2)<>"~$" Then 
     If InStr(f.Type, "Microsoft Word") Then 

     MsgBox f.Name 

     Set doc = ws.Documents.Open(Foldername & f.Name) 
     s = vbNullString 
     i = 1 
     Do While Trim(s) = vbNullString And i <= doc.Paragraphs.Count 
      s = doc.Paragraphs(i) 
      s = CleanString(Left(s, 10)) 
      i = i + 1 
     Loop 

     doc.Close False 

     If s = "" Then s = "NoParas" 
     s1 = s 
     i = 1 
     Do While fs.FileExists(s1) 
      s1 = s & i 
      i = i + 1 
     Loop 

     MsgBox "Name " & Foldername & f.Name & " As " & Foldername & s1 _ 
      & Right(f.Name, InStrRev(f.Name, ".")) 
     '' This uses copy, because it seems safer 

      f.Copy Foldername & s1 & Right(f.Name, InStrRev(f.Name, ".")), False 

      '' MoveFile will copy the file: 
     '' fs.MoveFile Foldername & f.Name, Foldername & s1 _ 
     '' & Right(f.Name, InStrRev(f.Name, ".")) 

     End If 
    End If 
Next 

msgbox "Done" 
ws.Quit 
Set ws = Nothing 
Set fs = Nothing 

Function CleanString(StringToClean) 
''http://msdn.microsoft.com/en-us/library/ms974570.aspx 
Dim objRegEx 
Set objRegEx = CreateObject("VBScript.RegExp") 
objRegEx.IgnoreCase = True 
objRegEx.Global = True 

''Find anything not a-z, 0-9 
objRegEx.Pattern = "[^a-z0-9]" 

CleanString = objRegEx.Replace(StringToClean, "") 
End Function 
+0

К сожалению это заняло меня так долго, чтобы ответить. Как выполнить этот скрипт? Я сохраняю его как .bat-файл или что-то еще? – Eddy

+0

.vbs для vbscript. Возможно, что vbscript отключен по политическим причинам: http://technet.microsoft.com/en-us/library/ee198684.aspx – Fionnuala

Смежные вопросы