2

I have more than hundred directories named SP_[number]_date. I'd like to rename all to just SP_[number].

I can only figure out how to do that by mv SP_1_date SP_1 but that will take ages. Can I rename all at once? I thought that I could do something like for num in ./*; do mv SP_$num_date SP_$num; done but it doesn't do the trick.

Jonathan Leffler
  • 653
  • 9
  • 15
Ditte
  • 329
  • 1
  • 4
  • 10
  • 1
    The `rename` expression would be `s/_date$//` – muru Aug 10 '15 at 07:20
  • is `date` literal or is a date, like in `SP_1_May 12, 2015`? – Rmano Aug 10 '15 at 10:50
  • The reason `mv SP_$num_date SP_$num` didn't work was that you don't have a variable `$num_date` (or, at least, that's one of the reasons). You would have needed `${num}_date` to separate the variable `$num` from a constant suffix `_date`. Another problem is that the value in `$num` might be `./SP_1_date` so the `mv` command was attempting to move `SP_./` (since `$num_date` was undefined and hence an empty string) to `SP_./SP_1_date`. – Jonathan Leffler Aug 10 '15 at 14:30

1 Answers1

6

A simple enough bash way:

for i in *_date
do
    mv "$i" "${i%%_date}"
done

${i%%_date} removes a trailing _date from the string in i.

muru
  • 193,181
  • 53
  • 473
  • 722
  • That would be great! So how many % should I add, when the number is up to four digits eg. SP_2200_date? – Ditte Aug 10 '15 at 07:26
  • @Ditte oh, the `%` is not related to the number of digits. `%%` removes the longest matching suffix , `%` removes the shortest matching suffix. For example, if I did `${i%_*date}`, I'd get `SP_2200`, and if I did `${i%%_*date}`, I'd get `SP`. In the case of the answer, it makes no difference, as I'm not using any wildcard. – muru Aug 10 '15 at 07:29
  • @Ditte search for `%%` in http://www.tldp.org/LDP/abs/html/string-manipulation.html – muru Aug 10 '15 at 07:30
  • I accidently only wrote one % and now they're all SP_num_date%_date... :( I can't really understand why I just can't use mv SP_$num_* SP_$num. Should I change switch the order of the "$i" and "$i%%_date-date" then? – Ditte Aug 10 '15 at 07:45
  • 1
    @Ditte It's `${i%%_date}`! With the braces! – muru Aug 10 '15 at 08:29