Como verificar um arquivo numericamente nomeado e, se existir, copiá-lo com um novo nome usando o próximo número sequencial

1

Primeiramente, quero me desculpar por minha falta de conhecimento; isso é literalmente meu primeiro script bash e meu conhecimento em Linux é basicamente inexistente. Respostas explicativas seriam muito apreciadas; Eu gostaria de aprender o porque não apenas o como.

Estou tentando escrever um script para automatizar um processo tedioso que precisa ser feito várias vezes ao dia. Em suma, esse script deve preparar um conjunto de arquivos com base em determinados requisitos. O script deve mover um arquivo de modelo e atribuir um número de versão ou copiar um arquivo existente usando um novo número de versão, com base no que está dentro de um diretório específico (por exemplo, criar se vazio, copiar se houver algo lá).

Como exemplo, o arquivo pode ser nomeado

YYYYMMDD _ ## _ username_testfile.json

em que o ## (número da versão) deve ser 01 para a primeira criação, depois 02 para a cópia, 03 para a cópia depois disso, etc. Um único diretório pode conter mais de 10+ desses arquivos, todos com diferentes datas e números de versão sequencial, bem como outros arquivos usando o mesmo formato, mas terminando em algo diferente de testfile.json

Não consigo encontrar uma maneira de fazer o script procurar no diretório "test" do arquivo que termina em testfile.json que possui o maior número de versão e, se encontrado, extrair o número da versão como variável / parâmetro Eu posso passar de volta para a seqüência de cp.

Neste ponto, nem sei qual comando usar; a internet tem oferecido de tudo, do grep ao awk, até a listagem e classificação ... minha cabeça está girando!

Qualquer ajuda seria apreciada. Eu tirei todas as informações de identificação, por favor, deixe-me saber se você precisar de mais informações.

    
por Alex 25.10.2016 / 22:17

1 resposta

1

Vamos dividi-lo em vários passos.

Vamos escrever uma função que retornará o próximo número. Vamos buscar simplicidade, ao invés de eficiência máxima

Você precisa fornecer um nome de diretório

Você precisa dar a testfile.json do nome do arquivo

Precisamos encontrar todos os arquivos nesse diretório que terminem com essa finalização.

Os parâmetros são passados para uma função usando $ 1, $ 2, etc.

getnum(){
  ls "$1" | grep "$2\$"
}

Use o corte para retirar apenas o segundo campo, usando _ como delimitador. (Note que se eu estivesse usando isso, eu usaria sed em vez de grep e cut, outros poderiam usar awk, mas vamos simplificar aqui).

getnum() {
 ls "$1" | grep "$2\$" | cut -d_ -f 2
}

Use a classificação para classificá-los numericamente

getnum() {
  ls "$1" | grep "$2\$" | cut -d_ -f 2 | sort -n
}

Use a cabeça para obter apenas o primeiro valor

 getnum() {
  ls "$1" | grep "$2\$" | cut -d_ -f 2 | sort -n | head -1
 }

Embrulhe isso para que possamos obter o valor em uma variável local

getnum() {
      local oldnum=$(ls "$1" | grep "$2\$" | cut -d_ -f 2 | sort -n | head -1)
}

Se não houver valores, defina o valor antigo como 0. Imprima um número de 2 dígitos, mais um que o antigo.

 getnum() {
  local oldnum=$(ls "$1" | grep "$2\$" | cut -d_ -f 2 | sort -n | head -1)
  if [ "$oldnum" = "" ]
  then
      oldnum=0
  fi
  printf "%02d\n" $(($oldnum+1))
 }

Observe que eu poderia ter omitido o teste de oldnum não sendo definido, pois $((oldnum+1)) seria expandido para $((+1)) nesse caso. Eu também posso usar expressões como $ (($ {oldnum: -0} +1)), consulte os manuais para mais informações.

Você poderia então usar uma função como essa

  dir=somewhere/logs
  ext=testfile.json
  cp template "$dir/$(date +%Y%m%d_)$(getnum "$dir" "$ext")_$USER_$ext"
    
por 26.10.2016 / 07:48

Tags