Refere-se a curinga no nome do arquivo

0

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 iniciados com b para um diretório chamado b , como eu faria isso com um comando?

Você pode fazer algo assim:

$ mv *0* */

Mas, de alguma forma, referencie o primeiro asterisco no argumento mover para?

    
por user3052786 14.05.2015 / 22:44

1 resposta

0

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.

    
por 14.05.2015 / 23:29