Top

organise module

#!/usr/bin/env python
import os
import sys
import click
import re
from tqdm import tqdm

if sys.version_info[0] < 3 and sys.version_info[1] < 6:
    raise Exception("You must be using Python 3.6 or greater")


class Sort(object):
    """ This is a simple tool which helps to organise your cluttered directory
    into meaningful subdirectories.

    **Example**:

        We are going to move the files into directories of their respective kinds, and if there are no files of that kind, a directory will not be
        created.

            $ organise -o
            or
            $ organise --organise

    Check out `organise --help` for complete list of options
    
    *Todo*:

        * Create configuration files, for easier handeling of settings
        * Handle console messages gracefully
        * Make it OS agnostic
    
    """

    DOC = "Document"
    VIDEO = "Video"
    IMG = "Image"
    OTHERS = "Others"
    APP = "Application"

    # Keep `OTHERS` at the end
    files_type_list = [DOC, VIDEO, APP, IMG, OTHERS]

    file_type_dict = {
        'doc': DOC,
        'docx': DOC,
        'ppt': DOC,
        'pptx': DOC,
        'pdf': DOC,
        'txt': DOC,
        '3gp': VIDEO,
        'mp4': VIDEO,
        'jpeg': IMG,
        'png': IMG,
        'gif': IMG,
        'jpg': IMG,
        "deb": APP,
        "py": APP
    }

    def __init__(self, path):
        super(Sort, self).__init__()
        self.path = path

    def rename(self):
        """
            Function used to rename the directories to user defined names
        """
        for type, i in zip(self.files_type_list, range(len(self.files_type_list))):
            t = input("What do you want {} to be called? [{}]: ".format(type, type))
            if t:
                self.files_type_list[i] = t

    def get_supported_formats(self):
        """
            Used to dispaly all the supported formats, ie which will be sorted into respective directories
        """
        click.echo("Supported formats:")
        i = 0
        for key, value in self.file_type_dict.items():
            i += 1
            click.echo("\t{}) {} --> {}".format(i, key, value))
        click.echo("\tMore coming soon")
        click.echo('Other file formats will be stored under Others')

    def get_absolute_path(self, filename):
        """Creates the complete path name and returns for the file

        Args:

            filename (str): Expects the name of the file

        Returns:

            str: The absolute path of the file

        """
        return self.path + "/" + filename

    def create_directory(self, key=None, directory=None):
        """Creates a directory, if it does not exist.

        Args:

            key (str): [optional] This is the name of the file
            directory (str): [optional] This is the complete path of the file

        **Note**: One of the, Args are to be passed.

        """
        if not directory:
            directory = self.path+"/"+key
        if not os.path.exists(directory):   
            os.makedirs(directory, exist_ok=True)
            click.echo("{}...Successfull".format(directory))
        else:
            self.skipped += 1

    def create_all_directory(self):
        """Creates all the types of directories."""
        self.skipped = 0
        for key in self.files_type_list:
            self.create_directory(key)
        click.echo("Skipped {}".format(self.skipped))

    def get_files(self):
        """Function used to generate a list of all the files in the current directory"""
        return next(os.walk(self.path))[2]

    def sort(self, verbose=False):
        """Main function which is used to organise the files into different directories.
        Args:

            verbose (bool): [optional] If `True`, displays all the steps to the user
        """
        files = self.get_files()
        for name in tqdm(files, disable=verbose):
            src = self.get_absolute_path(name)
            type = name.split('.')[-1]
            if type in self.file_type_dict.keys():
                dest = self.get_absolute_path(self.file_type_dict[type])
            else:
                dest = self.get_absolute_path(self.files_type_list[-1])
            if not os.path.exists(dest):
                self.create_directory(dest)
            if verbose:
                click.echo("Moving {} to {}".format(name, dest))
            os.system("mv" + " " + re.escape(src) + " " + dest)

    def run(self, verbose):
        self.create_all_directory()
        self.sort(verbose)


@click.command()
@click.option(
    "--path", "-p",
    help='path of directory you want to sort, DEFAULT: `.`'
)
@click.option(
    "--create-dir", "-d",
    is_flag=True,
    help='if you only want to create directories'
    )
@click.option(
    "--organise", "-o",
    is_flag=True,
    help='do not create empty directory, ie. create directory only when relevent file exists.'
    )
@click.option(
    "--verbose", "-v",
    is_flag=True,
    help='lets you know about each step'
    )
@click.option(
    "--rename", "-r",
    is_flag=True,
    help='to rename the subdirectories, your way'
    )
@click.option(
    "--formats", "-f",
    is_flag=True,
    help='display all the supported formats'
    )
def cli(path, create_dir, organise, verbose, rename, formats):
    """
        A little tool that helps you organise your directory into meaningful 
        subdirectories.
    """

    def get_path(path):
        if path:
            return path
        return "."

    path = get_path(path)
    sort = Sort(path)

    if rename:
        sort.rename()

    if create_dir:
        sort.create_all_directory()
    elif organise:
        sort.sort(verbose)
    elif formats:
        sort.get_supported_formats()
    else:
        sort.run(verbose)


if __name__ == "__main__":
    cli()

Classes

class Sort

This is a simple tool which helps to organise your cluttered directory into meaningful subdirectories.

Example:

We are going to move the files into directories of their respective kinds, and if there are no files of that kind, a directory will not be
created.

    $ organise -o
    or
    $ organise --organise

Check out organise --help for complete list of options

Todo:

* Create configuration files, for easier handeling of settings
* Handle console messages gracefully
* Make it OS agnostic
class Sort(object):
    """ This is a simple tool which helps to organise your cluttered directory
    into meaningful subdirectories.

    **Example**:

        We are going to move the files into directories of their respective kinds, and if there are no files of that kind, a directory will not be
        created.

            $ organise -o
            or
            $ organise --organise

    Check out `organise --help` for complete list of options
    
    *Todo*:

        * Create configuration files, for easier handeling of settings
        * Handle console messages gracefully
        * Make it OS agnostic
    
    """

    DOC = "Document"
    VIDEO = "Video"
    IMG = "Image"
    OTHERS = "Others"
    APP = "Application"

    # Keep `OTHERS` at the end
    files_type_list = [DOC, VIDEO, APP, IMG, OTHERS]

    file_type_dict = {
        'doc': DOC,
        'docx': DOC,
        'ppt': DOC,
        'pptx': DOC,
        'pdf': DOC,
        'txt': DOC,
        '3gp': VIDEO,
        'mp4': VIDEO,
        'jpeg': IMG,
        'png': IMG,
        'gif': IMG,
        'jpg': IMG,
        "deb": APP,
        "py": APP
    }

    def __init__(self, path):
        super(Sort, self).__init__()
        self.path = path

    def rename(self):
        """
            Function used to rename the directories to user defined names
        """
        for type, i in zip(self.files_type_list, range(len(self.files_type_list))):
            t = input("What do you want {} to be called? [{}]: ".format(type, type))
            if t:
                self.files_type_list[i] = t

    def get_supported_formats(self):
        """
            Used to dispaly all the supported formats, ie which will be sorted into respective directories
        """
        click.echo("Supported formats:")
        i = 0
        for key, value in self.file_type_dict.items():
            i += 1
            click.echo("\t{}) {} --> {}".format(i, key, value))
        click.echo("\tMore coming soon")
        click.echo('Other file formats will be stored under Others')

    def get_absolute_path(self, filename):
        """Creates the complete path name and returns for the file

        Args:

            filename (str): Expects the name of the file

        Returns:

            str: The absolute path of the file

        """
        return self.path + "/" + filename

    def create_directory(self, key=None, directory=None):
        """Creates a directory, if it does not exist.

        Args:

            key (str): [optional] This is the name of the file
            directory (str): [optional] This is the complete path of the file

        **Note**: One of the, Args are to be passed.

        """
        if not directory:
            directory = self.path+"/"+key
        if not os.path.exists(directory):   
            os.makedirs(directory, exist_ok=True)
            click.echo("{}...Successfull".format(directory))
        else:
            self.skipped += 1

    def create_all_directory(self):
        """Creates all the types of directories."""
        self.skipped = 0
        for key in self.files_type_list:
            self.create_directory(key)
        click.echo("Skipped {}".format(self.skipped))

    def get_files(self):
        """Function used to generate a list of all the files in the current directory"""
        return next(os.walk(self.path))[2]

    def sort(self, verbose=False):
        """Main function which is used to organise the files into different directories.
        Args:

            verbose (bool): [optional] If `True`, displays all the steps to the user
        """
        files = self.get_files()
        for name in tqdm(files, disable=verbose):
            src = self.get_absolute_path(name)
            type = name.split('.')[-1]
            if type in self.file_type_dict.keys():
                dest = self.get_absolute_path(self.file_type_dict[type])
            else:
                dest = self.get_absolute_path(self.files_type_list[-1])
            if not os.path.exists(dest):
                self.create_directory(dest)
            if verbose:
                click.echo("Moving {} to {}".format(name, dest))
            os.system("mv" + " " + re.escape(src) + " " + dest)

    def run(self, verbose):
        self.create_all_directory()
        self.sort(verbose)

Ancestors (in MRO)

  • Sort
  • builtins.object

Class variables

var APP

var DOC

var IMG

var OTHERS

var VIDEO

var file_type_dict

var files_type_list

Static methods

def __init__(

self, path)

Initialize self. See help(type(self)) for accurate signature.

def __init__(self, path):
    super(Sort, self).__init__()
    self.path = path

def create_all_directory(

self)

Creates all the types of directories.

def create_all_directory(self):
    """Creates all the types of directories."""
    self.skipped = 0
    for key in self.files_type_list:
        self.create_directory(key)
    click.echo("Skipped {}".format(self.skipped))

def create_directory(

self, key=None, directory=None)

Creates a directory, if it does not exist.

Args:

key (str): [optional] This is the name of the file
directory (str): [optional] This is the complete path of the file

Note: One of the, Args are to be passed.

def create_directory(self, key=None, directory=None):
    """Creates a directory, if it does not exist.
    Args:
        key (str): [optional] This is the name of the file
        directory (str): [optional] This is the complete path of the file
    **Note**: One of the, Args are to be passed.
    """
    if not directory:
        directory = self.path+"/"+key
    if not os.path.exists(directory):   
        os.makedirs(directory, exist_ok=True)
        click.echo("{}...Successfull".format(directory))
    else:
        self.skipped += 1

def get_absolute_path(

self, filename)

Creates the complete path name and returns for the file

Args:

filename (str): Expects the name of the file

Returns:

str: The absolute path of the file
def get_absolute_path(self, filename):
    """Creates the complete path name and returns for the file
    Args:
        filename (str): Expects the name of the file
    Returns:
        str: The absolute path of the file
    """
    return self.path + "/" + filename

def get_files(

self)

Function used to generate a list of all the files in the current directory

def get_files(self):
    """Function used to generate a list of all the files in the current directory"""
    return next(os.walk(self.path))[2]

def get_supported_formats(

self)

Used to dispaly all the supported formats, ie which will be sorted into respective directories

def get_supported_formats(self):
    """
        Used to dispaly all the supported formats, ie which will be sorted into respective directories
    """
    click.echo("Supported formats:")
    i = 0
    for key, value in self.file_type_dict.items():
        i += 1
        click.echo("\t{}) {} --> {}".format(i, key, value))
    click.echo("\tMore coming soon")
    click.echo('Other file formats will be stored under Others')

def rename(

self)

Function used to rename the directories to user defined names

def rename(self):
    """
        Function used to rename the directories to user defined names
    """
    for type, i in zip(self.files_type_list, range(len(self.files_type_list))):
        t = input("What do you want {} to be called? [{}]: ".format(type, type))
        if t:
            self.files_type_list[i] = t

def run(

self, verbose)

def run(self, verbose):
    self.create_all_directory()
    self.sort(verbose)

def sort(

self, verbose=False)

Main function which is used to organise the files into different directories. Args:

verbose (bool): [optional] If `True`, displays all the steps to the user
def sort(self, verbose=False):
    """Main function which is used to organise the files into different directories.
    Args:
        verbose (bool): [optional] If `True`, displays all the steps to the user
    """
    files = self.get_files()
    for name in tqdm(files, disable=verbose):
        src = self.get_absolute_path(name)
        type = name.split('.')[-1]
        if type in self.file_type_dict.keys():
            dest = self.get_absolute_path(self.file_type_dict[type])
        else:
            dest = self.get_absolute_path(self.files_type_list[-1])
        if not os.path.exists(dest):
            self.create_directory(dest)
        if verbose:
            click.echo("Moving {} to {}".format(name, dest))
        os.system("mv" + " " + re.escape(src) + " " + dest)

Instance variables

var path