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!

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.


É 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.


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.