View on Github

Replacing mv

Filter uses regular expressions to rename files. I have always felt this is the "missing UNIX command":

$ filter report* "s/..from.chris.//"

report analysis (from chris).doc   -> report analysis.doc
report datasheet (from chris).xls  -> report datasheet.xls
report discussion (from chris).doc -> report discussion.doc

Rename these files? [y/N]
$ filter * "s/Episode./S01E0/"
Game of Thrones Episode 1.mpg -> Game of Thrones S01E01.mpg
Game of Thrones Episode 2.mpg -> Game of Thrones S01E02.mpg
Game of Thrones Episode 3.mpg -> Game of Thrones S01E03.mpg

ename these files? [y/N]


filter wraps around GNU sed, so it uses s/search/replace syntax. For example, to rename all .txt files, changing the a's to e's:

$ filter *.txt s/a/e/

The syntax also supports backreferences, which are captured in brackets. Refer to groups with \1, \2 etc.

$ filter * "s/foo(.)bar/baz\1/"

foo1bar.txt -> baz1.txt
foo2bar.txt -> baz2.txt
foo3bar.txt -> baz3.txt

Rename these files? [y/N]


filter is just a small script, but it solves a frustrating problem. Every time I'm in this situation I consult Google and come across gems like:

find . -exec echo echo "{}" | sed 's/./foo/g'\;
ls F00001-0708-*|sed 's/\(.\).\(.*\)/mv & \1\2/' | sh
for i in *; do ; mv "$i" "echo $i | sed "s/(.) - (.) - (.) - (.).ogg/\1 - \4 - \3 - \2.ogg/""; done

I hope that you like my solution better.