/icanhasren

renamer in Haskell

Primary LanguageHaskellGNU General Public License v3.0GPL-3.0

This tool renames files and directories based on patterns.

Patterns
========

There are two kinds of patterns: literal, variable. The latter ones are
surrounded by a pair of brackets i.e.: []. The patterns which handle string
values support the change of case:

  * x  - unchanged

  * XX - upper case

  * Xx - first character upper case, others lower case

  * xx - lower case

Some patterns support limiting the action to a particular part of the file
name. In this cases the selector character is located after the pattern character.
For example:

  [Xe] - limits the extraction to the extension

The pattern character always sets the casing, not the selector character.

Selector characters are:

  * f - whole file name

  * n - name without extension

  * e - extension

The following patterns are available:

Full file name
--------------

  Pattern: [F], [FF], [ff], [Ff]

  Description: returns the whole file name

File name
---------

  Pattern: [N], [NN], [nn], [Nn]

  Description: returns the file name without the extension

Extension
---------

  Pattern: [E], [EE], [ee], [Ee]

  Description: returns the extension

Counters
--------

  There are two types of counters: string, integer. Multiple different counters
  (with different properties) can be specified in a pattern. It is possible to
  use one counter several times in a pattern, it will be incremented only
  once. The general format of the pattern is:

    [Cid:format,step]

  Pattern: [C]

  Description: returns a counter value, counting from 1, with the default
               format

  Pattern: [C:format]

  Description: the format influences multiple properties. First it chooses
               between numerical, and character counters. If the format is all
               digits it will be a numerical, otherwise it will be a character
               counter. In both cases it sets the start value of the counter
               as well.

               In the case of a numerical counter the format sets the padding
               length as well. For example: 0001, the counter will be padded
               with nulls to a length of 4.

               In the case of character counters it is possible to set the
               character case as usual, with varying the casing of the C.

  Examples: * [C:2]     start from 2 do not change formatting

            * [C:001]   start from one, pad the result with 0 to a length of 3

            * [C:a]     use a character counter

            * [CC:A]    use a character counter, with upper case characters

            * [Cc:bb]   use a character counter, start from bb, first character
                        is upper case others lower case

  Pattern: [C:format,steps]

  Description: format is the same as before. The steps describe the difference
               between two counts

  Pattern: [Cid]

  Description: id is a numerical value, which gives a name to the counter
               allowing multiple counters to co-exist. Only the first
               occurence of the counter has to be configured.

  Examples: * [C1:001][C2:a][C1]   the first counter is a numerical one,
                                   with a padded format. The second is a
                                   character counter. The first counter is
                                   used again, here only the id is given.

Extraction
----------

  Pattern: [X:start]

  Description: returns the substring denoted by start. Start is a one based
               index. If start is negative, then the index is from the end of
               the string. If the start is past or before the string, then no
               or all characters will be returned.  The extractor pattern
               supports selector characters.

  Examples: * [X:3]   return the substring of the file name from
                      the third character

            * [X:-2]  return the substring from the second character
                      from the end of the string

            * [Xxe:2] return the from the second character of
                      the extension, with the first letter upper cased the
                      others lower cased

  Patter: [X:start,length]

  Description: returns the substring denoted by start with the given length.
               If the length is negative, then the substring before start with
               the given length will be returned.

Modification time
-----------------

  Pattern: [D]

  Description: returns the modification date of the file. Format is: YYYYmmdd

  Pattern: [D:format]

  Description: returns the modification time with the given format.
               The formatting characters are the same as for strftime().

Collisions
==========

There are three types of collisions: existing files, new names colliding, and
new names colliding with old names. In show mode these three types are
displayed along with the old and new names. The following symbols are used:

  * - existing files would be overwritten
  ! - the new name of the file is the same as the new name of some other file(s)
  = - the new name of the file is the same as the old name of some other file

Existing files will not be overwritten, unless the force command line option
is given.

If a new name collision is detected the program exits, as this is certainly
not the desired outcome.

If an old name collision is detected, the application tries to solve this by:
re-ordering the file renames, inserting temporary renames given there is a
circular dependency between the renames.

Options
=======

  -h       --help
               Usage information.

  -s       --show-only
               Only show renames.

  -l FILE  --log=FILE
               Log rename actions to file. The format of the file is:
               [old name]:[new name]

  -i FILE  --input=FILE
               Load renames from file. The file format should be the same as
               the log is writing.

  -u FILE  --undo=FILE
               Undo renames from a log file. The old names in the files will
               be used as new, and the new as old names.

  -f       --force
               Force renaming. Existing files will be overwritten.