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

1

tenho dúvidas. Eu tenho que renomear o arquivo com o número de seqüência 1 a 10. Eu sou capaz de 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á levando.Porque eu quero renomear um arquivo como. comando mv vai levar {1..10}?

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

logo abaixo o comando está certo?

for file in $(ls);
do

mv $file file.$(date +%Y%m).$$.{1..10}
done
    
por peer mohammed 22.04.2017 / 10:15

1 resposta

3

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

    
por 22.04.2017 / 10:26