Tech Blog - mixross
ツールの内容
画像ファイルが大量にアーカイブされている場合、解凍してからプレビューなどのツールで1枚1枚画像ファイルの内容をチェックするのが面倒なのでコマンド一発で画像ファイルを全て1つのPDFにするようにした。
とりあえずzipまたはrarの中のjp(e)g、pngに対応。
その他の圧縮形式や画像形式に対応したい場合は、以下のソースを少し修正すれば十分拡張は可能。
準備
Macで標準インストールされているunzip以外にunrar、ImageMagickを使うので入っていない場合はインストールする
brew install unrar
brew install imagemagick@6
ImageMagickはいくつか環境変数の設定をしなくてはいけないので、インストール時のログを参考に対応する。
自分の時は~/.bash_profileに以下を追記した。
~/.bash_profile
export PATH=/usr/local/opt/imagemagick@6/bin:$PATH
export LDFLAGS="-L/usr/local/opt/imagemagick@6/lib"
export CPPFLAGS="-I/usr/local/opt/imagemagick@6/include"
ソースコード
imgzip2pdf
#!/bin/bash
if [ $# == 0 ]; then
echo "[Error] parameter is nothing!"
exit 1
fi
SRC=$1
if [ ! -f $SRC ]; then
echo '[Error] src file is not found'
exit 1
fi
SRC_EXT=`tr '[A-Z]' '[a-z]'<<<${SRC##*.}`
if [ $SRC_EXT != "zip" ] && [ $SRC_EXT != "rar" ]; then
echo '[Error] invalid src file type'
exit 1
fi
if [ $# -eq 1 ]; then
DIST=${SRC%.*}.pdf
elif [ -d $2 ]; then
DIST=$2/${SRC%.*}.pdf
else
DIST=$2
fi
DIST_EXT=`tr '[A-Z]' '[a-z]'<<<${DIST##*.}`
if [ $DIST_EXT != "pdf" ]; then
DIST=$DIST.pdf
fi
TMP_DIR=$(mktemp -d /tmp/$(basename $0).XXXXXX)
if [ $SRC_EXT == "zip" ]; then
unzip -jq -d "$TMP_DIR" "$SRC"
elif [ $SRC_EXT == "rar" ]; then
unrar e -idq "$SRC" "$TMP_DIR"
fi
if [ $? -ne 0 ]; then
echo "[Error] unzip error"
rm -fr "$TMP_DIR"
exit 1
fi
convert "$TMP_DIR/*.{jpg,jpeg,png}" "$DIST"
rm -fr "$TMP_DIR"
使い方
imgzip2pdf <アーカイブファイル> (<出力先パス>)
解説
引数の数
$#
引数の値
1個目:$1
、2個目:$2
、・・・、n個目:$n
ちなみに
$0
で実行時のコマンドが取得できる。
ファイル、ディレクトリの存在チェック
ファイル・存在
if [ -f $SRC ]; then
fi
ファイル・非存在
if [ ! -f $SRC ]; then
fi
ディレクトリ存在
if [ -d $SRC ]; then
fi
ディレクトリ・非存在
if [ ! -d $SRC ]; then
fi
拡張子の取得
シェルの変数展開を利用して拡張子(ドットの後続文字列)を取得している。
変数展開の例
記述 | 内容 | |
---|---|---|
${変数名#パターン} | 前方一致(最短マッチ)の削除 | |
${変数名##パターン} | 前方一致(最長マッチ)の削除 | ★今回使用 |
${変数名%パターン} | 後方一致(最短マッチ)の削除 | |
${変数名%%パターン} | 後方一致(最長マッチ)の削除 |
ファイル名(最後のドットより前方全て)を取得する場合は
${SRC%*.}
となる。
コマンド結果を変数に格納
HOGE=`<command>`
のようにバッククオートでコマンド文字列を囲む
文字列の大文字を全て小文字に変換
trコマンドを使って小文字に変換ができる。
tr '[A-Z]' '[a-z]'
このtrコマンドに入力となる文字列をリダイレクトするには<<<
を用いて
tr '[A-Z]' '[a-z]' <<< $HOGE
とする。
一時ディレクトリ作成
一時ファイルを作成するコマンドmktempに-dオプションを指定すると一時ディレクトリを作成できる。
mktemp -d <末尾にXXXXXXを指定したパス文字列>
unzipコマンド
unzip <オプション> <zipファイルパス>
オプション | 内容 |
---|---|
j | ディレクトリを作成しないで展開 |
q | 動作メッセージを減らす |
d <ディレクトリパス> | 展開先の指定 |
unrarコマンド
ディレクトリ構造を無視して展開(unzipの-jオプションと同様)する場合はeコマンドを指定して
unrar e <オプション> <rarファイルパス> <展開先ディレクトリパス>
オプション | 内容 |
---|---|
idq | 出力メッセージを無しに |
画像ファイルをPDFに変換(連結)
ImageMagickのconvertコマンドでできる。