Yiffany
Yiffany

Reputation: 352

Batch rename file with regex: remove prefix

I have files <uuid>_CS_Filename, and i want replace uuid_ => with ".*?_" to "".

How can I do this?

So, for;

1557acc7f3cd5d1538b71fe77bcf9ec0_My_filename_ch101.pdf

I want:

My_filename_ch101.pdf

I don't want to install some 3rd party packages; I searched the internet and only found brew install rename.

Upvotes: 0

Views: 1229

Answers (3)

rustyhu
rustyhu

Reputation: 2157

Use sed:

filename="1557acc7f3cd5d1538b71fe77bcf9ec0_My_filename_ch101.pdf"
newname=$(echo $filename | sed -e 's/^[a-z0-9]*_//g')
# newname is "My_filename_ch101.pdf"

Assume the files to rename are all in current directory:

for f in *; do
  mv "$f" "$(echo $f | sed -e 's/^[a-z0-9]*_//g')"
done

Upvotes: 3

tjm3772
tjm3772

Reputation: 3154

Using bash parameter expansions:

#!/bin/bash
for f in * ; do
  [[ -e "${f}" ]] || continue
  mv "${f}" "${f#*_}"
done

Upvotes: 2

j_b
j_b

Reputation: 2020

Using cut:

cut -d '_' -f 2- <<<"1557acc7f3cd5d1538b71fe77bcf9ec0_My_filename_ch101.pdf"

Sample usage:

$ touch 1557acc7f3cd5d1538b71fe77bcf9ec0_My_filename_ch101.pdf
$ fname="1557acc7f3cd5d1538b71fe77bcf9ec0_My_filename_ch101.pdf"
$ ls $fname
1557acc7f3cd5d1538b71fe77bcf9ec0_My_filename_ch101.pdf
$ mv "$fname" $(cut -d '_' -f 2- <<<"$fname")
$ ls *My*
My_filename_ch101.pdf

Upvotes: 2

Related Questions