Batchload rename .docx file to the title of document. (+ tip)
New here? Learn about Bountify and follow @bountify to get notified of new bounties! x

Need to change .docx files names to the first title on the text.

file.docx --> change to whatevertitleisondocumentis.docx more than 100 at time.

has to be for linux/ubuntu.

Thanx everyone

Are titles always the first sentence in the document?
feroldi 29 days ago
And could you also upload a docx document for demonstration?
feroldi 29 days ago
Yes, its always the first sentence.
Tsi 29 days ago
how to upload doc through Bountify
Tsi 29 days ago
What should happen if two or more documents have the same title?
feroldi 29 days ago
this wont happen all docs have different titles, in all cases a example, exampe1 should be added for text with same titles.
Tsi 29 days ago
awarded to feroldi

Crowdsource coding tasks.

1 Solution


My solution is written in Python 3.7. It depends on python-docx. Simply install it with pip (use the correct version of pip, i.e. pip3.7):

pip3 install --user python-docx

After installing its dependency, you're able to run the script. Here's and example of a run:

python3 rename-docs.py /path/to/docs 

The program accepts both a word document file, or a directory that contains word document files. In the former, it just renames that file. In the latter, it renames all files in that directory, adding a suffix -N after the title in case of duplicates, where N starts from 0 onwards.

Passing the parameter -v makes it display more information about the process.

In case you're working with .doc files (the 2003 version), then you have to convert them to .docx using soffice:

cd /path/to/docs
soffice --convert-to docx *.doc
rm *.doc

Here's the program:

#!/usr/bin/env python3

import argparse
import sys
import os
import pathlib
import docx
import logging
import subprocess
import errno

logger = logging.getLogger(__name__)
logging.basicConfig(
    stream=sys.stderr,
    level=logging.INFO,
    format=(
        '[%(asctime)s] {%(filename)s:%(lineno)d} %(levelname)s - %(message)s'))


def find_doc_title(doc):
    for paragrah in doc.paragraphs:
        if paragrah.text:
            return paragrah.text
    return None


def rename_document_to_title(doc_path, titles):
    doc = docx.Document(doc_path)
    title = find_doc_title(doc)
    if title:
        if title in titles:
            suffix = f'-{titles[title]}'
            titles[title] += 1
        else:
            suffix = ''
            titles[title] = 0
        title_words = title.split()
        while True:
            title = ' '.join(title_words)
            titled_doc_name = f'{title}{suffix}.docx'
            try:
                os.rename(doc_path, doc_path.parent / titled_doc_name)
            except OSError as e:
                if e.errno == errno.ENAMETOOLONG:
                    title_words.pop()
                else:
                    raise
            else:
                break
        logger.debug(f'renamed `{doc_path}` to `{titled_doc_name}`')
    else:
        logger.debug(f'skipping `{doc_path}`: no title found')


if __name__ == '__main__':
    args = argparse.ArgumentParser()
    args.add_argument(
        'path',
        help='path to a docx file, or a directory containing docx files')
    args.add_argument(
        '-v',
        '--verbose',
        action='store_true',
        help='display more information')
    opts = args.parse_args()
    logger.setLevel(logging.DEBUG if opts.verbose else logging.INFO)
    documents_path = pathlib.Path(opts.path)
    titles = {}
    if documents_path.is_dir():
        for docx_path in documents_path.glob('*.docx'):
            rename_document_to_title(docx_path, titles)
    else:
        rename_document_to_title(documents_path, titles)
i notice this happens when name is too long, is there a way to modify this, titiles are toooo long.
Tsi 29 days ago
I just tested it with long titles, and it works fine. Perhaps you could send me the problematic docx via e-mail (you can find it on my profile) and I can take a look at it.
feroldi 29 days ago
27 words long title?... cause i cant change the title manually even if i want i got a message in ubuntu saying is too long.
Tsi 29 days ago
In that case, one solution is to limit the title to N words, or to take only the initials of each word only when the title is too long, or to just ignore that file and do nothing with it. What do you prefer?
feroldi 29 days ago
limit to N words as there are many files longer than 25 words.
Tsi 29 days ago
The new script is now updated on my post.
feroldi 29 days ago
didnt find the email on the profile
Tsi 29 days ago
Ace!... now its working perfectly!!! How many files can be renamed at once?
Tsi 29 days ago
Great. :)
feroldi 29 days ago
how can i contactyou?
Tsi 29 days ago
My e-mail is on my github page: https://github.com/feroldi/
feroldi 29 days ago
last thing is / on subtitle is not working
Tsi 29 days ago