Gábor Bencze
Gábor Bencze

Reputation: 23

Python: Move files to folders containing pattern in names

Want to automatize the sorting process. But can't work it out. Have about thousand files with the same extension in the same folder. Want to sort them to different folders like: XXpattern1XX.XXX file to [pattern1]folder, Xpattern2XXX.XXX file to [pattern2]folder, pattern3XXXX.XXX file to [pattern3]folder and so on.

Have a script from SO but can't find the original post. But could not figure it out how to change it yet.

#!/usr/bin/env python3

import os
import subprocess
import shutil

# --------------------------------------------------------
reorg_dir = "/path/to/directory_to_reorganize"
exclude = (".jpg") # for example
remove_emptyfolders = True
# ---------------------------------------------------------

for root, dirs, files in os.walk(reorg_dir):
    for name in files:
        subject = root+"/"+name
        if name.startswith("."):
            extension = ".hidden_files"
        elif not "." in name:
            extension = ".without_extension"
        else:
            extension = name[name.rfind("."):]
        if not extension in exclude:
            new_dir = reorg_dir+"/"+extension[1:]
            if not os.path.exists(new_dir):
                os.mkdir(new_dir)
            n = 1; name_orig = name
            while os.path.exists(new_dir+"/"+name):
                name = "duplicate_"+str(n)+"_"+name_orig
                n = n+1
            newfile = new_dir+"/"+name
            shutil.move(subject, newfile)

def cleanup():
    filelist = []
    for root, dirs, files in os.walk(reorg_dir):
        for name in files:
            filelist.append(root+"/"+name)
    directories = [item[0] for item in os.walk(reorg_dir)]
    for dr in directories:
        matches = [item for item in filelist if dr in item]
        if len(matches) == 0:
            try:
                shutil.rmtree(dr)
            except FileNotFoundError:
                pass

if remove_emptyfolders == True:
    cleanup()

thnx

Upvotes: 0

Views: 1009

Answers (2)

DareYang
DareYang

Reputation: 369

You can try something like:

patterns = ['pattern1', 'pattern2', ...]
folders = [os.path.join(main_directory, pattern) for pattern in patterns]

# build folders
for folder in folders:
    if not os.path.exists(folder):
        os.makedirs(folder)

# move files in corresponding folders
for file in files:  # files is the list of all your file paths
    for pattern, folder in zip(patterns, folders):
        file_name = os.path.basename(file)
        if pattern in file_name:
            os.rename(file, os.path.join(folder, file_name))

Upvotes: 2

Vikrant Sharma
Vikrant Sharma

Reputation: 419

Check glob for paths with patterns

Upvotes: -1

Related Questions