Linux

【シェルスクリプト】不要ファイルを除いたzipファイルを作成するプログラム

私は普段Web制作の仕事をしており、作業ファイルをzip化してクライアントに納品ファイルを渡すことが多いです。

ただ、作業ファイルをそのまま納品することはありません。

手作業で納品ファイルを作るのは面倒😇

作業ファイルには納品には必要のないファイルやフォルダ(node_modulesや.git、.DS_Store等)があります。

手作業で不要ファイルを削除し、納品ファイルを作成することが真っ先に思いつく方法です。

しかし、工程が多くて面倒臭い、本来必要なファイルまで削除して納品してしまうといった危険性を孕んでいます。

そんな面倒臭い作業はシェルスクリプトに任せてしまいましょう!

シェルスクリプトとはコマンドの一連の流れをファイルとしてまとめたものです。

今回はシェルスクリプトを使って、不要ファイルを除いたzipファイルを秒で作成する方法を解説します。

サンプル

GitHubリポジトリ

リポジトリの中身はシェルスクリプトファイルとzip対象ファイル群です。

https://github.com/posipan/zip-sh

ソースコード

こちらはシェルスクリプトのソースコードです。

sampleディレクトリと同一階層に同一名のzipファイルを作る想定です。

対象ディレクトリまでのパスはご自身の環境に置き換えてください。

#!/bin/bash

# 変数宣言
BASE=zip-sh
TARGET=sample
DELIVERY=delivery

BASE_PATH=/Users/sugure/Documents/web/utility/${BASE}

# deliveryフォルダが存在しなれば、deliveryフォルダを作成する
mkdir -p ${BASE_PATH}/${DELIVERY}

# 対象ディレクトリまで移動する
cd ${BASE_PATH}/${TARGET}

# node_modulesと.DS_Storeを除いてzipファイルを作成する
# 今回の場合、deliveryフォルダ内にsample.zipというファイルが作成される
zip -r ${BASE_PATH}/${DELIVERY}/${TARGET}.zip * -x "*node_modules*" ".DS_Store"

コード解説

シバン

こちらはシェルスクリプトを記述する際の決まり文句のようなもので必ず1行目で宣言します。

「このシェルスクリプトはbashによって解釈・実行されます」と宣言しています。

#!/bin/bash

変数宣言

フォルダ名やベースとなるパスを変数として宣言しています。

汎用性の高いものは変数として宣言してしまった方が便利です。

# 変数宣言
BASE=zip-sh
TARGET=sample
DELIVERY=delivery

BASE_PATH=/Users/sugure/Documents/web/utility/${BASE}

deliveryフォルダを作成

mkdir -p [ディレクトリ名]とすることで存在しないディレクトリを作成することができます。

if文を使わずに短い記述で済みます😲

ここでは変数宣言したdeliveryという名前のフォルダを作成しています。

# deliveryフォルダが存在しなれば、deliveryフォルダを作成する
mkdir -p ${BASE_PATH}/${DELIVERY}

zipするフォルダまで移動

cdコマンドでzip対象の作業ディレクトリまで移動します。

# zip対象のディレクトリまで移動する
cd ${BASE_PATH}/${TARGET}

zip!!

構文は以下の通りです。

zip -r [アウトプットファイルの名前] [zip対象のフォルダ] -x [除外ファイル]

オプション説明
-rディレクトリを再帰的に圧縮する
-x対象のファイルやフォルダを除外する

除外対象ファイルは一例です。

# node_modulesやGit関連ファイル、.DS_Storeを除いてzipファイルを作成する
# 今回の場合、deliveryフォルダ内にsample.zipというファイルが作成される
zip -r ${BASE_PATH}/${DELIVERY}/${TARGET}.zip * -x "*node_modules*" ".DS_Store"

シェルスクリプトを実行する

実行方法は主に2つあります。

権限を与えてから実行する

実行権限がない場合は権限を付与してあげます。

chmod 755 zip.sh

以下のコマンドでシェルスクリプトを実行します。

./zip.sh

bashコマンドで実行する

実行権限を付与せずに以下のコマンドで実行することも可能です。

bash zip.sh

実行結果

シェルスクリプトを実行し、アウトプットファイルの中身を確認してみると、コマンドで除外したファイルを含めないzipファイルが作成されます。

シェルスクリプト実行前のzip対象フォルダの中身
シェルスクリプト実行時
シェルスクリプト実行後(解凍済みアウトプットファイルの中身)

おわりに

このように頻繁に行う作業はシェルスクリプト化するととても楽チンです🙌