Search code examples
regexbashrenamefilenames

matching and reformatting poorly typed filenames


I have a large number of filenames that have been poorly formatted, which I would like to clean up. The idea is to reformat the names so that they are more sensible.

Here are some examples:

01harpharm_3.1.aiff 1
01harpmute_2.6.aiff 1
01harpmute_2.6.aiff 2
01harpmute_2.6.aiff 3
01harpmute_2.6.aiff 4

If we look at the last example, the goal would be to rewrite

01harpmute_2.6.aiff 4 as 01harpmute_2.6.4.aiff.

I would like to use bash for this, either via a script (for loop), find, rename, or a combination thereof. Would anyone have opinions on how to best tackle this?


Solution

  • Could you please try following once. Following will only print the rename commands on screen, you could run 1 command from it and if you are happy with results then you could run my 2nd code.

    find . -type f -name "*.aiff*" -print0 | 
    while IFS= read -r -d '' file
    do
      echo "$file" | 
      awk '
        BEGIN{ s1="\"" }
        { val=$0; sub(/^\.\//,""); sub(/\.aiff/,"."$2"&",$1)
          print "mv " s1 val s1 OFS $1
        }'
    done
    

    OR in case you want to put condition and check if file name has space or not so put an additional condition in awk command it will skip files which are not having space in their names.

    find . -type f -name "*.aiff*" -print0 | 
    while IFS= read -r -d '' file
    do
      echo "$file" | 
      awk '
        BEGIN{ s1="\"" }
        NF==2{ val=$0; sub(/^\.\//,""); sub(/\.aiff/,"."$2"&",$1)
          print "mv " s1 val s1 OFS $1
        }'
    done
    


    Run following only after you have tested above code successfully please.

    find . -type f -name "*.aiff*" -print0 | 
    while IFS= read -r -d '' file
    do
      echo "$file" | 
      awk '
        BEGIN{ s1="\"" }
        { val=$0; sub(/^\.\//,""); sub(/\.aiff/,"."$2"&",$1)
          print "mv " s1 val s1 OFS $1
        }' | sh
    done