terminal script for renaming folders in a specific scheme
First off, I have to say that the example bash code used in this answer, shown further below, is by no means robust, however it does get the job done!

With the following as a representative sample of the hierarchical structure of directories:

.
├── ABCD
├── EFGH
├── IJKL
├── MNOP
│   ├── A Most Violent Year (2014) 1180 20150807Lov
│   ├── A Most Wanted Man (2014) 1146
│   ├── A Nightmare on Elm Street (2010) 0432
│   ├── A Perfect Getaway (2009) 0433
│   └── ¡NO! (2012) 0939
├── QRST
├── UVWX
└── YZ


Then after running the example bash code saved as a bash script, and run from within the directory containing the hierarchical structure show above, the results for the directories will be as shown below, and being as the stated desired output based on the representative sample of the hierarchical structure of directories shown above:

.
├── ABCD
├── EFGH
├── IJKL
├── MNOP
│   ├── (0432) A Nightmare on Elm Street (2010)
│   ├── (0433) A Perfect Geatway (2009)
│   ├── (0939) ¡NO! (2012)
│   ├── (1146) A Most Wanted Man (2014)
│   └── (1180) A Most Violent Year (2014) 20150807Lov
├── QRST
├── UVWX
└── YZ


To use the example bash code, In Terminal cd to the directory containing the ABCD, EFGH, etc. directories and run the following commands:

touch rendir; nano rendir


In nano copy and paste the example bash code, show below, into the rendir file and then press Control+X and then Y and then Enter.

Next:

chmod u+x rendir


Now that it's executable, run it by typing:

./rendir


Then press Enter to run it.

Example bash code:

#!/bin/bash

find -E . -type d -regex '.* [0-9]{4}$' &gt; /tmp/foo

while read -r l; do
    p="$(dirname "$l")"
    d="$(basename "$l")"
    n="$(awk '{print "("$NF")"}'&lt;&lt;&lt;"$d")"
    f="$(awk '{$NF=""; sub(/ $/, "", $0); print $0}'&lt;&lt;&lt;"$d")"
    echo mv "$l" "$p/$n $f"
done&lt;/tmp/foo

find -E . -type d -regex '.* [0-9]{4} .*$' &gt; /tmp/foo

while read -r l; do
    p="$(dirname "$l")"
    d="$(basename "$l")"
    n="$(awk '{print "("$(NF - 1)")"}'&lt;&lt;&lt;"$d")"
    f="$(awk '{$(NF - 1)=""; print $0}'&lt;&lt;&lt;"$d" | awk 'sub(/  /," ")')"
    echo mv "$l" "$p/$n $f"
done&lt;/tmp/foo

rm /tmp/foo


Note that as coded, it will output the mv commands that would be executed if echo wasn't there. After testing and examining the output to see that the mv commands are properly formed, you can the edit rendir (nano rendir) and remove the two occurrences of echo, saving the file, again using (Control+X and then Y and then Enter) and executing it again.

At this point you should have the desired output as shown in the second tree hierarchical structure of directories shown above. This example bash code does not account for any deviation from what was expressed in the OP and comments to the OP.



NOTE: You should never run code without first being properly backed up and or testing the code on a sample copy of the originals.



If I knew awk better I'd imagine that an awk program could be written to manipulate the input string to the desired output string in a single calling of awk, but I don't know awk well enough to achieve that.

Note: The example bash code is just that and does not employ any error handling and is meant only to show one of many ways accomplish a task. The onus is always upon the User to add/use appropriate error handling as needed/wanted.