Linha de Comandos: crie um arquivo com novo nome de arquivo, se o nome do arquivo já existir

8

Eu queria saber se era possível ter um comando que cria um arquivo, mas toda vez que o comando é executado, ele não substitui o arquivo criado na execução anterior.

Por exemplo: touch test1.txtcriaria 1 arquivo chamado test1.txt. Mas na próxima vez que o executar, gostaria que o novo arquivo fosse chamado test2.txt, ou algo assim. 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!

Nick Lemaire
fonte

Respostas:

9

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*receberá um carimbo de data / hora mais recente, resultando em 2 arquivos.

Rinzwind
fonte
É exatamente isso que eu estava procurando, obrigado! :)
Nick Lemaire
Não funciona em um script (não espera entre) - Eu tentei touch test$(date +%Y%m%d-%H%M%S) ; touch test$(date +%Y%m%d-%H%M%S), ele criou apenas um arquivo. O tempo em nanossegundos funciona: touch test$(date +%Y%m%d-%H%M%S%N) ; touch test$(date +%Y%m%d-%H%M%S%N)e touch test$(date +%Y%m%d-%H%M%S%N) test$(date +%Y%m%d-%H%M%S%N)crie dois arquivos cada.
Volker Siegel
É melhor usar $()uma vez permite expressões ninho, mas você também pode usar acentos graves: touch test`date +%Y%m%d-%H%M%S`.
Pablo Bianchi
5

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 gratuito, o arquivo é criado com touch.

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

enzotib
fonte
brilhante, ótima função.
Marco Ceppi
1

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

Michał Šrajer
fonte
mktemp gera um nome de arquivo aleatório e exclusivo, usando um modelo. Você provavelmente capturaria a saída do mktemp em uma variável. De linuxmanpages :TMPFILE=$(mktemp /tmp/example.XXXXXXXXXX) || exit 1 echo "program output" >> $TMPFILE
bgvaughan 08/08
Outro método comum é usar a corrente id processo, desde a variável shell $$:TMPFILE='/tmp/tmp.$$'; touch $TMPFILE
bgvaughan