web-dev-qa-db-ja.com

特定の作成日を持つファイルでのみmogrify変換を使用するにはどうすればよいですか?

Mogrifyのconvertを使用してアニメーションGIFを作成しています。ただし、現時点では、数十の画像が含まれているフォルダーにアクセスし、見つかったすべての画像を使用するように指示しています。ただし、特定の日に作成されたファイルのみを使用したいと思います。私はそのようなことをすることができますか?

現在使用されているコマンド:

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

私のファイル名はすべてタイムスタンプなので、代わりに次のような範囲を指定できるようにしたいと思います。

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

convertのマニュアルページを試しましたが、うまくいきませんでした。これは可能ですか?

2

この小さなシェルスクリプトは、現在のディレクトリ内のすべてのファイルをループし、最後に変更されたタイムスタンプをstartおよびendタイムスタンプ(ここでは10月10日)によって作成された範囲と比較します。一致するファイルがfiles配列に追加され、配列にファイルがある場合は、それらに対してconvertが呼び出されます。少なくとも2つ(またはそれ以上)のファイルが必要な場合は、-gt 0-gt 1に調整します。

通常、作成時間はファイルの(Unix)属性に保存されないため、このメソッドは単純なtouch 1476158400.jpgにだまされて、古いファイルが新しく見える可能性があることに注意してください。 2番目のオプションについては、以下を参照してください。

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

画像の名前が少し異なる場合は、次のようにします。

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
Tigger