Crie um novo arquivo, mas adicione um número se o nome do arquivo já existir

0

É possível conseguir isso a partir da linha de comando?

Sintaxe: posso capturar uma imagem com o seguinte comando:

raspistill -o image.jpg

Mas eu quero ser capaz de executar este comando via cron a cada minuto e obter algo parecido com isto

image1.jpg, image2.jpg, image3.jpg, etc ...

    
por Dante 06.10.2018 / 13:22

2 respostas

1
#!/bin/sh

num=1
outfile="image$num.jpg"

while [ -e "$outfile" ]; do
    num=$(( num + 1 ))
    outfile="image$num.jpg"
done

raspistill -o "$outfile"

O loop no script acima incrementará a variável num em um e criará um novo nome de arquivo de saída em outfile usando esse número, até que um nome de arquivo que não seja obtido seja encontrado.

Isso pode falhar se várias cópias do script forem executadas simultaneamente, pois há uma condição de corrida entre o teste da existência do nome do arquivo e a criação do novo arquivo. A execução do script com um intervalo de um minuto não deve ser um problema, a menos que demore um minuto ou mais para que raspistill crie o novo arquivo. Nesse caso, adicione touch "$outname" após o loop para "reivindicar" o nome do arquivo o mais rápido possível (invocações simultâneas do script ainda podem falhar).

Por "falhando" quero dizer duas ou mais invocações do script usando o mesmo nome do arquivo com raspistill .

    
por 06.10.2018 / 13:57
3

Se você não se importar com o valor do sufixo enquanto as imagens estiverem em ordem numérica crescente, você poderá usar a data e a hora

raspistill -o "$(date --utc +'image%Y%m%d%H%M.jpg')"

Estenda com %S por segundos, se necessário.

Se você planeja adicionar isso como um one-liner, lembre-se de que % é um caractere especial em uma entrada crontab . Evite o problema e coloque-o em um script (muito pequeno) e chame o script de cron ou preceda cada % com uma barra invertida \ . Veja man 5 crontab para os detalhes (procure por % ).

    
por 06.10.2018 / 13:36

Tags