Восстановление имен файлов для doc и RTF

У меня несколько сотен .док и. rtf файлы, которые потеряли свои оригинальные имена после восстановления с поврежденного жесткого диска. В основном они выглядят так:

f132765720.rtf
f136246056.rtf
f146124320.doc
f147595288.docx
f131673632.rtf

Я могу читать файлы без каких-либо проблем. Как я могу воссоздать значимые имена файлов из содержимого файлов в Linux?

пример файла:https://dl.dropboxusercontent.com/u/41225253/example.rtf

2 ответа:

скрипт ниже найдет все .docx и .rtf файлы в текущем каталоге и переименовать их в first_few_words.rtf или docx. Сначала нужно установить catdoc. В Debian и его производных вы можете сделать это с помощью

sudo apt-get install catdoc 

как ни странно, catdoc дает мне segfault, когда я пытаюсь его на docx у меня есть, так что используйте docx2txt для файлов doc вместо:

sudo apt-get install docx2txt

после catdoc и docx установлено, cd в каталоге что содержит ваши файлы и запустить это:

for file in *rtf; do 
  name=$(catdoc "$file" | grep . | head -1 | sed 's/ /_/g') &&
  mv "$file" "$name".rtf;
done
for file in *docx; do 
  name=$(docx2txt < "$file" | grep . | head -1 | sed 's/ /_/g') &&
  mv "$file" "$name".docx;
done

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

пояснение: обе утилиты конвертировать docx или rtf в текст, затем я выбираю первую непустую строку этого текста, конвертировать пробелы в подчеркивания (это сделает вашу жизнь проще в долгосрочной перспективе) и переименовать файлы соответственно.

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

для .docx файлы дата можно найти таким образом:

unzip -p example.docx | grep dcterms:created |
    grep -o [0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] | head -1

для .doc-файлы:

antiword -x db example.doc | grep date | grep -o '[0-9-]*'

для .rtf-файлы:

grep -o '\creatim\yr[0-9]*\mo[0-9]*\dy[0-9]*' example.rtf |
    grep -o [0-9]* | tr "\n" -