Como uso o mgrify convert apenas em arquivos com uma determinada data de criação?

2

Estou criando um gif animado usando convert do mogrify. No entanto, no momento eu corro em uma pasta com dezenas de imagens, e eu apenas instruí-lo para usar todas as imagens que encontrar. No entanto, eu gostaria que ele usasse apenas arquivos que foram criados em uma data específica. Posso fazer uma coisa dessas?

Comando atual usado:

convert -delay 10 -loop 0 images/* animation.gif

Todos os meus nomes de arquivos são timestamps, então, alternativamente, eu gostaria de poder especificar um intervalo, algo como:

convert -delay 10 -loop 0 --start="images/147615000.jpg" --end="images/1476162527.jpg" animation.gif

Eu tentei as páginas convert man, mas sem sorte. Tudo isso é possível?

    
por please delete me 11.10.2016 / 07:12

2 respostas

1

Este pequeno script de shell percorrerá todos os arquivos no diretório atual e comparará seu carimbo de data / hora da última modificação ao intervalo criado pelos carimbos de data start e end (aqui, 10 de outubro). Os arquivos correspondentes são adicionados à matriz files e, se houver arquivos na matriz, ele chama convert neles. Ajuste o -gt 0 para -gt 1 se você quiser ter pelo menos dois arquivos (ou mais).

Observe que o tempo de criação não é normalmente preservado nos atributos de um arquivo (Unix), portanto, esse método poderia ser enganado por um simples touch 1476158400.jpg , o que faria um arquivo antigo parecer novo. Veja abaixo uma segunda opção.

#!/usr/bin/env bash

start=$(date +%s -d 'Oct 10 2016')
end=$(date +%s -d 'Oct 11 2016')

files=()
for f in *
do
  d=$(stat -c%Z "$f")
  [[ $d -ge $start ]] && [[ $d -le $end ]] && files+=("$f")
done

[[ ${#files[*]} -gt 0 ]] && convert -delay 10 -loop 0 "${files[*]}" animation.gif

Como alternativa, se os próprios nomes de arquivo codificam o timestamp de criação, você pode usar um loop de força bruta para encontrá-los:

start=$(date +%s -d 'Oct 10 2016')
end=$(date +%s -d 'Oct 11 2016')
files=()
for((i=start;i<=end;i++)); do [[ -f "${i}.jpg" ]] && files+=("${i}.jpg"); done
[[ ${#files[*]} -gt 0 ]] && convert -delay 10 -loop 0 "${files[*]}" animation.gif
    
por 11.10.2016 / 10:53
1

Se as suas imagens tiverem um nome ligeiramente diferente, assim:

images/147615000-000.jpg
images/147615000-001.jpg
... more images ...
images/147615000-090.jpg

Você pode fazer isso:

convert -delay 10 -loop 0 images/147615000-*.jpg animation.gif

Mas acredito que as imagens sejam um timestamp por um motivo.

Você pode tentar algo parecido com este script:

#!/bin/sh
# 
# Find images from $1 to $2 inclusive

if [ "$2" = "" ]
then
    echo "Pass the first and last file."
    exit
fi
# Basic file check
if [ ! -f "$1" ]
then
    echo "$1 not found."
    exit
fi
if [ ! -f "$2" ]
then
    echo "$2 not found."
    exit
fi

# Get the file list. Note: This will skip the first file.
list='find "./" -type f -newer "${1}" -and -type f -not -newer "${2}"'

# Include the first image
list="./$1
$list"
# Sort the images as find may have them in any order
list='echo "$list" | sort'

# create the animation.gif
convert -delay 10 -loop 0 $list animation.gif

# say something
echo "Done"

Coloque esse script no diretório que você deseja criar "animation.gif" e suponho que as imagens estejam em um subdiretório. Você ligaria assim:

sh ./fromToAnimation.sh images/147615000.jpg images/1476162527.jpg

Isso funcionará desde que não haja espaços ou outros caracteres especiais nos nomes ou no caminho do arquivo.

    
por 11.10.2016 / 09:14