Como eu crio nomes de arquivos numerados seqüencialmente no bash?

3

Eu preciso de um script que crie um arquivo com o próximo arquivo em uma sequência. Cada execução do script deve criar apenas um arquivo e o script pode ser executado zero ou mais vezes em um determinado dia. Os arquivos devem ser nomeados após a data atual no formato %y%m%d com o segundo arquivo tendo -01 anexado, o terceiro arquivo a ser criado em uma determinada data teria -02 etc. Por exemplo:

20170125.txt  // first file create on the day.
20170125-01.txt // 2nd file
20170125-02.txt // 3rd file

Até agora eu tenho este script super básico que cria o meu primeiro arquivo diário, mas estou perplexo sobre como fazer a numeração incremental depois disso.

#! /bin/bash

DATE='date +%Y%m%d'
touch "$DATE.txt"
    
por Greg B 25.01.2017 / 11:56

4 respostas

8
today="$( date +"%Y%m%d" )"
number=0

while test -e "$today$suffix.txt"; do
    (( ++number ))
    suffix="$( printf -- '-%02d' "$number" )"
done

fname="$today$suffix.txt"

printf 'Will use "%s" as filename\n' "$fname"
touch "$fname"

today obtém a data de hoje e inicializamos nosso contador, number a zero. Em seguida, testamos para ver se o nome do arquivo já existe ( $suffix estará vazio para começar). Se isso acontecer, incremente o contador e crie um novo sufixo usando printf . Repita até que não tenhamos mais uma colisão de nome de arquivo.

A string de formato para o printf , -%02d , significa "um traço literal seguido por um inteiro de dois dígitos preenchido com zero". O traço duplo ( -- ) é necessário na frente da string de formatação para impedir que printf interprete o traço em a string de formato como uma opção.

O touch está lá apenas para testes.

Isso gerará nomes de arquivos como

20170125.txt
20170125-01.txt
20170125-02.txt
20170125-03.txt

nas corridas subsequentes.

    
por 25.01.2017 / 12:49
3

Você pode usar seq . Ele pode criar sequências numéricas de várias formas, mas você precisa saber o número total de arquivos.

Exemplo: você pode experimentar seq -w 1 10 . Ele criará a sequência de 01 a 10 e você poderá incluí-la em um loop:

for i in 'seq -w 1 10'
do
  touch 'date +%Y%m%d'-$i.txt
done

Adendo da sua última atualização de pergunta:

Para realizar o que você deseja com facilidade, você pode criar o primeiro arquivo com -0 . Em execuções subseqüentes, você precisa obter a lista de arquivos, sort , pegar o último, cut do último - e obter o número, incrementá-lo e criar o novo arquivo com esse número.

O preenchimento precisará de mais algum trabalho.

    
por 25.01.2017 / 12:02
2

Algo como ...

#!/bin/bash
DATE=$(date +%Y%m%d)
filename="${DATE}.txt"
num=0
while [ -f $filename ]; do
    num=$(( $num + 1 ))
    filename="${DATE}-${num}.txt"
done
touch $filename

... deve funcionar. Isso cria nomes de arquivos no formato DATE-1.txt, DATE-2.txt, DATE-3.txt, ..., DATE-10.txt, DATE-11.txt, etc. Alterando isso para DATE-01.txt etc é deixado como um exercício para o leitor:)

Note que você provavelmente também deve certificar-se de não chamar o script mais de uma vez ao mesmo tempo; caso contrário, você terá mais de um script modificando as coisas.

Nota: há muitos softwares para gerenciar várias versões de um arquivo. Eles são chamados de "sistemas de controle de versão" (VCS) ou "Gerenciamento de controle de origem" (SCM). Git e subversão são muito populares. Eu sugiro que você verifique, em vez de reimplementar o seu próprio: -)

    
por 25.01.2017 / 12:34
0

Se você já tiver o valor do contador em uma variável de ambiente, poderá usar a aritmética Bash para gerar o nome do arquivo .... o $ ((ctr + = 1)) incrementa o valor de ctr e substitui o valor no nome do arquivo string.

$ ctr=0
$ touch file-$(( ctr+=1 ))-name.txt
$ touch file-$(( ctr+=1 ))-name.txt
$ touch file-$(( ctr+=1 ))-name.txt
$ touch file-$(( ctr+=1 ))-name.txt
$ ls
file-1-name.txt  file-2-name.txt file-3-name.txt  file-4-name.txt
    
por 07.02.2018 / 12:22