Consulte o curinga no nome do arquivo

Consulte o curinga no nome do arquivo

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 ae 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.

informação relacionada