Linha de comando: crie um arquivo com um novo nome de arquivo se o nome de arquivo já existir

Linha de comando: crie um arquivo com um novo nome de arquivo se o nome de arquivo já existir

Fiquei me perguntando se era possível ter um comando que criasse um arquivo, mas toda vez que o comando fosse executado, ele não sobrescreveria o arquivo criado na execução anterior.

Por exemplo: touch test1.txtcriaria 1 arquivo chamado test1.txt. Mas da próxima vez que eu executá-lo, gostaria que o novo arquivo fosse chamado test2.txtou algo parecido. Portanto, sem substituir o arquivo já existente. De certa forma, poderia ser executado várias vezes sem problemas.

Não me entenda mal, não estou tentando criar vários arquivos com um comando.

Desde já, obrigado!

Responder1

A solução mais fácil seria adicionar um carimbo de data/hora ao nome do arquivo e não usar um único dígito.

O método mais fácil de criar um arquivo vazio seria touch test$(date +%Y%m%d-%H%M%S)e isso resultaria em um arquivo chamado test20110802-170410. Uma segunda vez test*obterá um carimbo de data/hora mais recente, resultando em 2 arquivos.

Responder2

Duvido que exista um comando geral para fazer isso, mas você pode pensar em algo assim:

create() {
  read prefix number suffix < <(sed -r 's/(.*)([0-9]+)\.(.*)$/\1 \2 \3/' <<<"$1")
  while true; do
    file="$prefix$number.$suffix"
    if [[ -e "$file" ]]; then
      ((number++))
    else
      touch "$file"
      break
    fi
  done
}

O parâmetro de entrada para a função é dividido em prefixo, número, sufixo e, até que o arquivo exista, o número é incrementado. Encontrado um slot livre, o arquivo é criado com a extensão touch.

O mecanismo de divisão deve ser adaptado às suas necessidades e várias verificações de erros devem ser adicionadas.

Responder3

Se os números de sequência não forem necessários, a maneira mais fácil é usar mktempo comando.

informação relacionada