Um comando, uma linha:
for n in *;do [ -f "$n" ] && case "$n" in a*) mv "$n" a/;; b*) mv "$n" b/;; esac; done
Como alternativa, você pode derivar o nome do diretório do nome do arquivo, mas eu não mostrei isso inicialmente, estimando-o como uma linha mais longa. Por exemplo, a instrução no loop seria (primeira tentativa):
d=$(echo "$n" | sed -e 's/^\(.\).*//'); [ -f "$n" ] && mv "$n" $d/
usaria a primeira letra do nome do arquivo fornecido para obter o nome do diretório. Compare com
[ -f "$n" ] && case "$n" in a*) mv "$n" a/;; *b) mv "$n" b/;; esac
para a declaração de caso. Na verdade, não muito mais, mas é mais difícil digitar na hora. Como bash
é mencionado, pode-se usar sua sintaxe de substring ${parameter:offset:length}
para encurtar essa linha:
d=${n:0:1}; [ -f "$n" ] && mv "$n" $d/
ou
[ -f "$n" ] && mv "$n" ${n:0:1}/
(lembro-me disso como uma extensão bash e não o encontro em POSIX ).
Com relação à pergunta atual sobre a reutilização de curingas: que aparentemente se refere a expansão de cinta . Esses são expandidos antes do ponto em que você precisaria deles. Citando a documentação:
Brace expansion is performed before any other expansions, and any characters special to other expansions are preserved in the result. It is strictly textual. Bash does not apply any syntactic interpretation to the context of the expansion or the text between the braces. To avoid conflicts with parameter expansion, the string ‘${’ is not considered eligible for brace expansion.