Brian Schroeter
Brian Schroeter

Reputation: 1633

Removing 10 Characters of Filename in Linux

I just downloaded about 600 files from my server and need to remove the last 11 characters from the filename (not including the extension). I use Ubuntu and I am searching for a command to achieve this.

Some examples are as follows:

aarondyne_kh2_13thstruggle_or_1250556383.mus should be renamed to aarondyne_kh2_13thstruggle_or.mus

aarondyne_kh2_darknessofunknow_1250556659.mp3 should be renamed to aarondyne_kh2_darknessofunknow.mp3

It seems that some duplicates might exist after I do this, but if the command fails to complete and tells me what the duplicates would be, I can always remove those manually.

Upvotes: 2

Views: 5671

Answers (5)

chepner
chepner

Reputation: 531125

This script assumes each file has just one extension. It would, for instance, rename "foo.something.mus" to "foo.mus". To keep all extensions, remove one hash mark (#) from the first line of the loop body. It also assumes that the base of each filename has at least 12 character, so that removing 11 doesn't leave you with an empty name.

for f in *; do
    ext=${f##*.}
    new_f=${base%???????????.$ext}
    if [ -f "$new_f" ]; then
        echo "Will not rename $f, $new_f already exists" >&2
    else
        mv "$f" "$new_f"
    fi
done

Upvotes: 0

Mikhail Vladimirov
Mikhail Vladimirov

Reputation: 13890

find . -type f -exec sh -c 'mv {} `echo -n {} | sed  -E -e "s/[^/]{10}(\\.[^\\.]+)?$/\\1/"`' ";"

Upvotes: 1

Kent
Kent

Reputation: 195049

one way to go:

you get a list of your files, one per line (by ls maybe) then:

ls....|awk  '{o=$0;sub(/_[^_.]*\./,".",$0);print "mv "o" "$0}'

this will print the mv a b command

e.g.

kent$  echo "aarondyne_kh2_13thstruggle_or_1250556383.mus"|awk  '{o=$0;sub(/_[^_.]*\./,".",$0);print "mv "o" "$0}'
mv aarondyne_kh2_13thstruggle_or_1250556383.mus aarondyne_kh2_13thstruggle_or.mus

to execute, just pipe it to |sh

I assume there is no space in your filename.

Upvotes: 0

TimWolla
TimWolla

Reputation: 32701

Try using the rename command. It allows you to rename files based on a regular expression:

The following line should work out for you:

rename 's/_\d+(\.[a-z0-9A-Z]+)$/$1/' *

The following changes will occur:

aarondyne_kh2_13thstruggle_or_1250556383.mus renamed as aarondyne_kh2_13thstruggle_or.mus
aarondyne_kh2_darknessofunknow_1250556659.mp3 renamed as aarondyne_kh2_darknessofunknow.mp3

You can check the actions rename will do via specifying the -n flag, like this:

rename -n 's/_\d+(\.[a-z0-9A-Z]+)$/$1/' *

For more information on how to use rename simply open the manpage via: man rename

Upvotes: 4

user1596371
user1596371

Reputation:

Not the prettiest, but very simple:

echo "$filename" | sed -e 's!\(.*\)...........\(\.[^.]*\)!\1\2!'

You'll still need to write the rest of the script, but it's pretty simple.

Upvotes: 1

Related Questions