Não há nada errado em usar um while
loop aqui. Você só precisa fazer certo:
set -- *.jpeg
while (($#)); do
mv -- "${1}" "${1/DSC/Paris}"
shift
done
O loop while
acima é tão confiável quanto o loop for
(ele funcionará com qualquer nome de arquivo) e enquanto o último é - em muitos casos - a ferramenta mais apropriada para usar, o primeiro é válido alternativa 1 que tem seus usos (por exemplo, o acima pode processar três arquivos por vez ou processar apenas um certo número de argumentos, etc.).
Todos esses comandos ( set
, while..do..done
e shift
) estão documentados no manual do shell e seus nomes são autoexplicativos ...
set -- *.jpeg
# set the positional arguments, i.e. whatever that *.jpeg glob expands to
while (($#)); do
# execute the 'do...' as long as the 'while condition' returns a zero exit status
# the condition here being (($#)) which is arithmetic evaluation - the return
# status is 0 if the arithmetic value of the expression is non-zero; since $#
# holds the number of positional parameters then 'while (($#)); do' means run the
# commands as long as there are positional parameters (i.e. file names)
mv -- "${1}" "${1/DSC/Paris}"
# this renames the current file in the list
shift
# this actually takes a parameter - if it's missing it defaults to '1' so it's
# the same as writing 'shift 1' - it effectively removes $1 (the first positional
# argument) from the list so $2 becomes $1, $3 becomes $2 and so on...
done
1: Não é uma alternativa às ferramentas de processamento de texto, então NUNCA use um loop while
para processar o texto.