oplaTech About Teaching Archive
Oplatek's external memory

Renaming files: parameter expansion is good but not so good

Why do I need it?


From time to time, I need to have more files in one directory than is healthy (I can not see them on one screen). In order to group them by simple ls command I need to change a prefix. As an example, I want to have separately labs and lectures:)

$ ls
Lecture1_LabTeacher_topicA.pdf
Lecture1_LectureTeacher_topicE.pdf
Lecture2_LabTeacher_topicF.pdf
Lecture2_LectureTeacher_topicB.pdf
Lecture3_LectureTeacher_topicC.pdf
Lecture4_LectureTeacher_topicD.pdf

Let us say, that I want to solve it by putting Lab prefix instead of Lecture prefix.

$ for F in *Lab*; do echo "${F}" "Lab${F#Lecture}"; done

Results:

Lab1_LabTeacher_topicA.pdf
Lab2_LabTeacher_topicF.pdf
Lecture1_LectureTeacher_topicE.pdf
Lecture2_LectureTeacher_topicB.pdf
Lecture3_LectureTeacher_topicC.pdf
Lecture4_LectureTeacher_topicD.pdf

Similarly variable expansion is useful for batch converting of images:

for I in *.jpg; do convert "$I" "${I%jpg}png" ; done

Drawbacks: If you need batch substitution


Not everything you can split into prefix, middle part and suffix. So I started using sed instead of bash substitution. In example below you can use both, bash variable expansion and sed. I choose it like a good example. Typical situation when I need substitution in arguments of commands is during renaming another set of lectures. Usually, we have 12-14 slides per semester, which makes a mess on command line.

$ ls
Lecture11.pdf
Lecture12.pdf
Lecture1.pdf
Lecture2.pdf
Lecture3.pdf
...
Lecture9.pdf

Renaming using sed substitution:

for F in *e[0-9].pdf; do mv "$F" `echo "$F"|sed s:Lecture:Lecture0:`; done