Produzindo o próximo nome de arquivo disponível para um padrão (02-output.log etc)

2

Eu posso usar mktemp(1) em um script de shell para criar um arquivo temporário em um diretório com um sufixo adequado & prefixo.

Existe um comando que, dado um padrão (por exemplo, NN-output.log ), procurará 01-output.log e, se houver, retornará 02-output.log (ou o próximo número disponível)? Eu quero um comando para "obter o próximo nome de arquivo sequencialmente disponível" sem ter que escrever isso sozinho em um script.

Eu sei que eu poderia usar date -Iseconds ou similar para obter nomes de arquivo únicos e crescentes, mas existe algo que produza nomes de arquivo mais simples?

Eu sei que provavelmente é fácil escrever um programa desses, mas antes de fazer isso sozinho, quero ver se alguém já fez isso.

Atualizar Alguém pergunta "como o script saberia o padrão?" Estou sugerindo que assim como o mktemp, um daria o padrão para o programa. por exemplo. "Dê-me o próximo arquivo chamado output-XX.log" e o programa examinaria os Xs e preencheria 01 , procuraria pelo arquivo, etc.

    
por Rory 03.04.2016 / 13:42

1 resposta

0

Abaixo está uma função de shell que pode ser usada com pelo menos ksh e bash. Como o comentário diz, é difícil esperar um padrão de entrada dessa questão em particular; isto é, do formato "XX" (exatamente dois X's) seguido por algo - não (alguma coisa) -XX como uma parte da questão implica.

O script usa a expansão de parâmetro para remover os XX's iniciais para salvar a recombinação posterior com o aumento do n index. Em seguida, ele passa de 1 a 99, preenche zero o número, se necessário, e procura a não existência [ ! -f ... ] de tal arquivo. Se não existir, ele imprime esse nome de arquivo e retorna com sucesso ( return 0 ). Se sair do loop sem localizar um arquivo disponível, ele imprime uma mensagem para stderr ( >&2 ), imprime nothing para stdout e retorna com um código de retorno malsucedido ( return 1 ).

# hard-coded to expect an input pattern of XX(something)
function rmktemp {
  pattern=$1
  suffix=${pattern#XX}
  n=1
  while [ $n -lt 100 ]
  do
    if [ $n -lt 10 ]
    then
      n="0${n}"
    fi
    tfile="${n}${suffix}"
    if [ ! -f "$tfile" ]
    then
      printf "%s\n" "$tfile"
      return 0
    fi
    n=$((n+1))
  done
  if [ $n -eq 100 ]
  then
    echo Could not find an unused file >&2
    return 1
  fi
}

Use como:

LOG=$(rmktemp XX-output.log)
[ $? -eq 0 ] && echo stuff > "$LOG"
    
por 08.08.2016 / 15:33