Reputation: 845
I have a pdf files in the format:
Author-YYYY-rest_of_text_seperated_by_underscores.pdf
John-2010-some_file.pdf
Smith-2009-some_other_file.pdf
I need to rename the files so that the year is first e.g.
YYYY-Author-rest_of_text_seperated_by_underscores.pdf
2010-John-some_file.pdf
2009-Smith-some_other_file.pdf
So that would mean moving the 'YYYY-' element to the start.
I do not have unix 'Rename' and must rely on sed, awk etc.I happy to rename inplace.
I have been trying to adapt this answer not having much luck. Using sed to mass rename files
Upvotes: 2
Views: 135
Reputation: 295288
See BashFAQ #100 for general advice on string manipulation with bash. One of the techniques this goes into is parameter expansion, which is heavily used in the below:
pat=-[0-9][0-9][0-9][0-9]-
for f in *$pat*; do # expansion not quoted here to expand the glob
prefix=${f%%$pat*} # strip first instance of the pattern and everything after -> prefix
suffix=${f#*$pat} # strip first instance and everything before -> suffix
year=${f#"$prefix"}; year=${year%"$suffix"} # find the matched year itself
mv -- "$f" "${year}-${prefix}-${suffix}" # ...and move.
done
By the way, BashFAQ #30 discusses lots of rename mechanisms, among them one using sed
to run arbitrary transforms.
Upvotes: 5
Reputation: 784958
Using BASH regex:
re='^([^-]+-)([0-9]{4}-)(.*)$'
for f in *.pdf; do
[[ $f =~ $re ]] &&
echo mv "$f" "${BASH_REMATCH[2]}${BASH_REMATCH[1]}${BASH_REMATCH[3]}"
done
When you're happy with the output remove echo
command before mv
.
Upvotes: 3