#!/bin/bash verbose=0 if [ "$1" == "-v" ]; then verbose=1 shift fi tmpdir=`mktemp -d "${1-.}/.FB2-XXXXXX"` find "$@" -path "$tmpdir" -prune -o \( -type f -name "*.fb2" -print \) | \ while read i; do tempfile=`mktemp -p "$tmpdir"` tempfile2=`mktemp -p "$tmpdir"` if XMLLINT_INDENT="" xmllint --encode UTF-8 --format "$i" 2>/dev/null >$tempfile; then xml2 < $tempfile | grep title-info | grep '/author$\|=' > $tempfile2 author=`2csv < $tempfile2 author last-name first-name middle-name nickname | sed 's@,\+@_@g;s,_$,,;s,^$,_,' | head -n 1` title=`2csv < $tempfile2 title-info book-title | head -n 1 | sed 's,["/],,g;s, \+,_,g;s,^_,,'` name="${author}_${title}.fb2" count= newname="$name" mkdir -p "$tmpdir/$author" while [ -e "$tmpdir/$author/$newname" ]; do count=$((count+1)) newname="${name%.fb2}${count}.fb2" done if [ $verbose -eq 1 ]; then echo `basename "$i"` '->' "$newname" fi cp $tempfile "$tmpdir/$author/$newname" rm "$i" else echo Error: `basename "$i"` 1>&2 fi rm $tempfile $tempfile2 done