Renaming folders in Terminal

Discussion in 'Mac Programming' started by supertonic, Jun 26, 2013.

  1. macrumors member

    Joined:
    May 5, 2010
    #1
    Have hundreds of folders with a 3-digit numbers at the end like this:

    sun101
    moon light347
    earth is round209


    Folder names vary in length but there is always a 3-digit number at the end.


    Need to remove the 3 numbers at the end & insert them in the beginning like this:

    101sun
    347moon light
    209earth is round


    Is it possible to do this in Terminal?


    thanks much
     
  2. macrumors 68040

    Joined:
    Feb 2, 2008
    #2
    It's possible, but where are the folders located? You can make a script that match the form you described then rename it. You can then use that script in a loop over a folder of files and folders. Just keep in mind that commands such as mv are destructive so you want to make sure that you test such a script and make sure you understand what it does.
     
  3. macrumors regular

    Joined:
    Apr 19, 2010
    #3
    Matching Patterns in the Unix Command Line

    My first thought would be to list the files with:

    ls

    http://learnbymac.com/doc/unix/bsd/ls.man.html

    and then do pattern matching with

    grep

    http://learnbymac.com/doc/unix/bsd/grep.man.html

    In a command such as the following:

    ls -R | grep '^.*\d\d\d$'

    This is just to start giving you an idea. The following expression:

    '^.*\d\d\d$'

    is called a "regular expression". Regular expressions are used for pattern-matching and for splitting things into pieces.

    In this regular expression the '^' character specifies the beginning of the file or folder name, followed any ".*" which means any number of any characters, and then "\d\d\d" specifies exactly three digits and finally "$" specifies the end of the file name.

    This command:

    ls -R | grep '^.*\d\d\d$'

    isn't exactly finished, but I wanted to give you an idea and something to google for (i.e. "split" and "regular expression").

    Other useful commands may be

    sed, awk, csplit

    I'm looking for people to teach Mac programming to. The service is free, I just want to get ideas for my web tutorials on my website.

    -- Kaydell
    kaydell@yahoo.com
    http://learnmacprogramming.com
     
  4. macrumors 68040

    Joined:
    Feb 2, 2008
    #4
    Code:
    #!/bin/bash
    
    # match the pattern
    ORIGINALNAME=$(echo "$1" | grep -P "^[A-z ]+\d{3}$")
    
    # if it doesn't match, quit
    if [ -z "$ORIGINALNAME" ]
    then
        exit 1
    fi
    
    # if it's not a directory, quit
    if [ "$(file -ib "$1")" != "directory" ]
    then
        exit 2
    fi
    
    
    # separate the numeric suffix from the name
    SUFFIX=$(echo "$1" | grep -oP "\d{3}$")
    NAME=$(echo "$1" | grep -oP "^[A-z ]+")
    
    # reverse the order
    NEWNAME="$SUFFIX""$NAME"
    
    # test the result
    echo "$NEWNAME"
    
    This will match the name of folders and print out the new name, to use it in a folder you can do like this:

    Code:
    for i in * ; do ./thescript.sh "$i" ; done
     
  5. macrumors member

    Joined:
    Aug 28, 2008
    #5
    oneliner
    Code:
    for i in $(ls -p|grep "/"|rev|cut -c2-|rev|sed s/\ /_/g);do thr=$(echo "$i"|rev|cut -c1-3|rev); rest=$(echo "$i"|rev|cut -c4- |rev); mv "$(echo "$i"|sed s/_/\ /g)" "$(echo ${thr}${rest}|sed s/_/\ /g)";done
     
  6. macrumors 68040

    Joined:
    Feb 2, 2008
    #6
    Just a heads up, that will rename all folders regardless of their name.
     
  7. thread starter macrumors member

    Joined:
    May 5, 2010
    #7
    Thanks for all your suggestions. I couldn't get any of these solutions to work & finally figured out some folder names started with underscore "_" . After removing those, these solutions worked.

    thanks again
     

Share This Page