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"