
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 touch
linha 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 touch
utilitário aceita qualquer número de argumentos na linha de comando. Nota: isso cria 10 arquivos, não um arquivo.
No entanto, o mv
utilitá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 ls
assim. 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