I know there are lots of such questions, but I couldn't find one (or a combination of several), which describes the things I want to do. I think I need to use regular expressions, but I am not very good with that. I use zsh. I have a folder with files, which I want to rename:
I want the files
challenge1.rb
,challenge2.rb
,challenge3.rb
, etc. to be renamed toc1.rb
,c2.rb
etc. Similarlytask1.rb
and similar must be renamed tot1.rb
etc.sample_spec_c1.rb
,sample_spec_c2.rb
etc. must be renamed toc1_spec.rb
,c2_spec.rb
etc.
So I guess I need some combination of regular expressions and iteration, but I don't know how to write the bash script.
Answer
Here is a short script which will do what you want. You can call the script with a list of files like: ./scriptname *.rb
or with directories (it will recurse them): ./scriptname .
Do not forget to set the executable bit: chmod a+x scriptname
.
#!/bin/sh
suff=rb # suffix of files to rename
script="$0" # this script name for recursion
for f in "$@" ; do
if test -d "$f" ; then
echo "=== recursing directory $f"
find "$f" -type f -name "*.$suff" -exec "$script" {} +
elif test -f "$f" ; then
d="$(dirname "$f")"
b="$(basename "$f")"
r="$(echo "$b" | sed -r "s/^([a-zA-Z])[a-zA-Z]*([0-9]+\.${suff})\$/\1\2/;s/^[a-zA-Z]+_([a-zA-Z]+)_([a-zA-Z]+[0-9]+)(\.${suff})\$/\2_\1\3/")"
echo "-- renaming $f -> $d/$r"
mv "$f" "$d/$r"
fi
done
No comments:
Post a Comment