Eu sei que posso usar um curinga para extrair arquivos com nomes de um formato específico no bash usando o asterisco, assim:
$ ls
a01 a02 a03 a04 a05 a06 a07 a08 a09 b01 b02 b03 b04 b05 b06 b07 b08 b09
$ ls a*
a01 a02 a03 a04 a05 a06 a07 a08 a09
$ ls b*
b01 b02 b03 b04 b05 b06 b07 b08 b09
Mas se eu quisesse fazer algo como mover todos os arquivos começando com a para um diretório chamado a
e mover todos os arquivos começando com b para um diretório chamado b
, como faria isso com um comando?
Você pode fazer algo assim:
$ mv *0* */
Mas de alguma forma faz referência ao primeiro asterisco no argumento move-to?
Responder1
Um comando, uma linha:
for n in *;do [ -f "$n" ] && case "$n" in a*) mv "$n" a/;; b*) mv "$n" b/;; esac; done
Alternativamente, você poderia derivar o nome do diretório do nome do arquivo, mas eu não mostrei isso inicialmente, estimando que fosse uma linha mais longa. Por exemplo, a instrução no loop seria (primeira tentativa):
d=$(echo "$n" | sed -e 's/^\(.\).*/\1/'); [ -f "$n" ] && mv "$n" $d/
usaria a primeira letra do nome de 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 de 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 do bash e não a encontro emPOSIX).
Em relação à questão real sobre a reutilização de curingas: isso aparentemente se refere aexpansão de cinta. Eles são expandidos antes do ponto em que você precisaria deles. Citando a documentação:
A expansão da cinta é realizadaantesquaisquer outras expansões e quaisquer caracteres especiais de outras expansões são preservados no resultado. Isso éestritamente textual. Bash faznãoaplicar qualquer interpretação sintática ao contexto da expansão ou ao texto entre colchetes. Para evitar conflitos com a expansão de parâmetros, a string '${' não é considerada elegível para expansão de chaves.