Search code examples
bashgrepfindfile-renamemv

Rename all files in a directory by omitting last 3 characters


I am trying to write a bash command that will rename all the files in the current directory by omitting the last 3 characters. I am not sure if it is possible thats why I am asking here.

I have a lots of files named like this : 720-1458907789605.ts

I need to rename all of them by omitting last 3 characters to obtain from 720-1458907789605.ts ---> 720-1458907789.ts for all files in the current directory.

Is it possible using bash commands? I am new to bash scripts.

Thank you!


Solution

  • Native bash solution:

    for f in *.ts; do
        [[ -f "$f" ]] || continue # if you do not need to rename directories
        mv "$f" "${f:: -6}.ts"
    done
    

    This solution is slow if you have really many files: star-expansion in for will take up memory and time.

    Ref: bash substring extraction.

    If you have a really large data set, a bit more complex but faster solution will be:

    find . -type f -name '*.ts' -depth 1 -print0 | while read -d $\0 f; do
        mv "$f" "${f%???.ts}.ts"
    done