如何仅对具有特定创建日期的文件使用 mogrify Convert?

如何仅对具有特定创建日期的文件使用 mogrify Convert?

我正在使用 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 脚本将循环遍历当前目录中的每个文件,并将其最后修改的时间戳与由startend时间戳构建的范围(此处为 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

只要文件名或路径中没有空格或其他特殊字符,此操作就可以工作。

相关内容