É possível renomear o arquivo com número de sequência usando {1..10}

É possível renomear o arquivo com número de sequência usando {1..10}

Eu tenho dúvida. Tenho que renomear o arquivo com o número de sequência de 1 a 10. Consigo criar um arquivo com o seguinte parâmetro.

touch file.$(date +%Y).$$.{1..10}

Mas não consigo renomear o arquivo usando o seguinte comando. Por que {1..10} não está sendo usado. Porque quero renomear um arquivo como. O comando mv levará {1..10} ?

file.201704.<PID>.1
file.201704.<PID>.2
.
.
.
.

então o comando abaixo está certo?

for file in $(ls);
do

mv $file file.$(date +%Y%m).$$.{1..10}
done

Responder1

A expansão das chaves {1..10}fará com que a linha de comando seja expandida para incluir vários argumentos.

Por exemplo, a touchlinha de comando 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. Tudo bem, pois o touchutilitário aceita qualquer número de argumentos na linha de comando. Nota: isso cria 10 arquivos, não um arquivo.

No entanto, o mvutilitário tem uma semântica diferente em comparação com o touch. Ele espera um ou vários arquivos/diretórios de origem e um único arquivo/diretório de destino no final.

Isto 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

presume-se que você deseja se movertodosos arquivos, exceto a ú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 deseja fazer nesse ciclo, então não posso comentar mais sobre como resolver esse problema.

Quando se trata do loop em si,por favornunca use a saída lsassim. Em vez disso, faça

for file in ./*; do
    # process "$file"
done

A saída de lsé para vocêOlhe para, não é adequado para consumo por um script por vários motivos. Verhttp://unix.stackexchange.com/questions/128985/why-not-parse-ls

Além disso, sempre coloque aspas duplas em suas variáveis. Verhttp://unix.stackexchange.com/questions/171346/security-implications-of-forgetting-to-quote-a-variable-in-bash-posix-shells

informação relacionada