我正在使用 mogrify 创建一个动画 gif convert
。然而,目前我运行在一个包含数十个图像的文件夹中,我只是指示它使用它找到的所有图像。但是,我希望它只使用在特定日期创建的文件。我能做这样的事吗?
当前使用的命令:
convert -delay 10 -loop 0 images/* animation.gif
我所有的文件名都是时间戳,所以我希望能够指定一个范围,例如:
convert -delay 10 -loop 0 --start="images/147615000.jpg" --end="images/1476162527.jpg" animation.gif
我已经尝试过convert
手册页,但没有成功。这有可能吗?
答案1
这个小 shell 脚本将循环遍历当前目录中的每个文件,并将其最后修改的时间戳与由start
和end
时间戳构建的范围(此处为 10 月 10 日)进行比较。匹配的文件被添加到files
数组中,如果数组中有任何文件,它就会调用convert
它们。如果您想要至少有两个文件(或更多),请将 调整为-gt 0
。-gt 1
请注意,创建时间通常不会保留在文件的 (Unix) 属性中,因此此方法可能会被简单的 欺骗touch 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
答案2
如果您的图像名称略有不同,如下所示:
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
只要文件名或路径中没有空格或其他特殊字符,此操作就可以工作。