A expansão da chave {1..10}
fará com que a linha de comando seja expandida para incluir vários argumentos.
Por exemplo, a linha de comando touch
será expandida para algo como
touch file.2017.5878.1 file.2017.5878.2 file.2017.5878.3 file.2017.5878.4 file.2017.5878.5 file.2017.5878.6 file.2017.5878.7 file.2017.5878.8 file.2017.5878.9 file.2017.5878.10
antes de ser executado. Isso está correto, pois o utilitário touch
usa qualquer número de argumentos na linha de comando. Nota: isso cria 10 arquivos, não um arquivo.
No entanto, o utilitário mv
tem semânticas diferentes em comparação com touch
. Ele espera um ou vários arquivos / diretórios de origem e um único arquivo / diretório de destino no final.
Isso significa que, quando
mv $file $file.$(date +%Y%m).$$.{1..10}
é expandido para algo como
mv file file.2017.5878.1 file.2017.5878.2 file.2017.5878.3 file.2017.5878.4 file.2017.5878.5 file.2017.5878.6 file.2017.5878.7 file.2017.5878.8 file.2017.5878.9 file.2017.5878.10
é assumido que você quer mover todos os arquivos, exceto pela última coisa na linha de comando. Além disso, espera que a última coisa na linha de comando seja um nome de diretório (já que você está movendo várias coisas).
Não está claro para mim o que você realmente quer fazer nesse loop, então não posso comentar mais sobre como resolver esse problema.
Quando se trata do próprio loop, por favor nunca use a saída de ls
dessa forma. Em vez disso, faça
for file in ./*; do
# process "$file"
done
A saída de ls
é para você ver , não é adequada para consumo por um script por vários motivos. Consulte o link
Além disso, sempre cite duas vezes suas variáveis. Consulte link