1

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

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

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

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

2 ответа2

3

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

sudo apt-get install catdoc 

Как ни странно, catdoc выдает мне ошибку , когда я пробую ее на моем 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 в текст, затем я выбираю первую непустую строку этого текста, преобразую пробелы в подчеркивания (это облегчит вашу жизнь в долгосрочной перспективе) и соответствующим образом переименовываю файлы.

1

К ответу, предоставленному @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" -

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