2018年4月30日月曜日

連番ファイルに降順のタイムスタンプをつける

家でASUS MemoPad ME176CというWi-Fiタブレットを使っているのですが、このデバイスにプリインストールされている「ギャラリー」というアプリで画像を見ると、タイムスタンプ順の降順(新しい順)に表示されます。

自分が撮影した写真だとこれでいいんですが、自炊した画像データをデバイスに流しこんで見るときはとても不便です。

一応ソートの順番を「古い順」や「名前順」に変更できるのですが、アプリはこの設定を覚えてくれないようで、再度ギャラリーを見るとまた新しい順にソートされて表示されます。

なんとかしてギャラリーを開いた時に意図した並び順になるようにしたい。

という事で、連番のファイルに降順のタイムスタンプをつけるプログラムをシェルスクリプトで書いてみることにします。

■シェルスクリプト
#!/bin/sh

target=${1}

if [ -z ${target} ]
then
    echo 'Target is not specified, operation aborted.'
    exit
fi

if [ ! -d ${target} ]
then
    echo 'Target is not a directory, operation aborted.'
    exit
fi

timestump=`date +%s`

find ${target} -type f -print | sort -r | while read file
do
    if [ `uname` = 'FreeBSD' ]
    then
        date=`date -r ${timestump} "+%Y%m%d%H%M.%S"`
    elif [ `uname` = 'Linux' ]
    then
        date=`date +%Y%m%d%H%M.%S --date "@${timestump}"`
    fi

    touch -t ${date} ${target}${file}

    timestump=`expr ${timestump} + 2`
done
上のシェルスクリプトをファイルに保存し、引数に連番の画像が含まれるディレクトリを指定します。

本当はFreeBSDとLinuxで同じ記述にしたかったのですが、dateの使い方が双方のOSで激しく違う為、unameの戻り値で場合分けしています。
やっていることはシンプルで、現在のUNIXTIMEを取得し、そこからファイル名の昇順に2秒ずつ足したタイムスタンプを設定していくだけ。

ちなみに、なぜ2秒なのかというと、SDカードのファイルシステムであるFAT32が、奇数秒のタイムスタンプを許容しない為です。
FAT32では、タイムスタンプに奇数秒の指定をすると、偶数に丸められてしまう(-1秒される)らしい。

0 件のコメント:

コメントを投稿