Как использовать mogrify convert только для файлов с определенной датой создания?

Более точное регулярное выражение для сопоставления чисел с плавающей запятой будет:

^[-+]?([0-9]*\.[0-9]+|[0-9]+\.[0-9]*)$

Это сводится к тому, что вы считаете поплавком. Python, например, принимает оба 5. и .5 как допустимые числа с плавающей запятой, и не требует ведущей или конечной цифры до или после . :

>>> 5.
5.0
>>> .5
0.5

Таким образом, приведенное выше регулярное выражение обрабатывает эти случаи, а также крайний случай только . (что не должно совпадать с ).

2
12.10.2016, 02:07
2 ответа

Этот небольшой сценарий оболочки будет перебирать каждый файл в текущем каталоге и сравнивать его отметку времени последнего изменения с диапазоном, созданным при запуске и end отметки времени (здесь 10 октября). Соответствующие файлы добавляются в массив files , и если в массиве есть какие-либо файлы, он вызывает для них convert . Измените -gt 0 на -gt 1 , если вы хотите иметь как минимум два файла (или больше).

Обратите внимание, что время создания обычно не сохраняется в атрибутах файла (Unix), поэтому этот метод можно обмануть простым касанием 1476158400.jpg , которое заставит старый файл выглядеть новым. См. Ниже второй вариант.

#!/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

В качестве альтернативы, если имена файлов сами по себе кодируют метку времени создания, вы можете использовать цикл грубой силы, чтобы найти их:

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
1
27.01.2020, 22:10

Если ваши изображения были названы несколько иначе, например:

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

Тогда вы можете сделать это:

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

Но я предполагаю, что изображения имеют временную метку по какой-то причине.

Вы можете попробовать что-то вроде этого сценария:

#!/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"

Поместите этот сценарий в каталог, который вы хотите создать, «animation.gif», и я предполагаю, что изображения находятся в подкаталоге. Вы бы назвали его так:

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

Это будет работать до тех пор, пока в именах файлов или пути нет пробелов или других специальных символов.

1
27.01.2020, 22:10

Теги

Похожие вопросы