Escreva um script de shell que obtenha os arquivos como parâmetros:
#!/bin/bash
for filepath; do
parentpath="${filepath%/*}"
if [ "$parentpath" != "$filepath" ]; then # $file contains a /
file="${filepath#"$parentpath"/}"
else
file="$filepath"
parentpath=""
fi
filename="${file%.*}"
if [ -z "$parentpath" ]; then
mkdir -p "$filename" && mv "$file" "$filename"
else
mkdir -p "${parentpath}/$filename" &&
mv "$filepath" "${parentpath}/$filename"
fi
done
Você pode chamar esse script como ./script *.ext1 *.ext2 *.ext3
para números não muito grandes de arquivos ou como find ... -exec ./script {} +
para grandes números.