前回の続きとなります。
以下のスクリプトを紹介しましたが、それの解説となります。
# !/bin/sh
if [ $# != 1 ]; then
echo "引数を1つ指定してください"
exit 1
fi
DIRCNT=`pwd | wc -m`
let DIRCNT++
ALLFILES=`pwd`'/'$1'/'*
FINDFILE=`find $ALLFILES -type f`
for NOWFILE in $FINDFILE;
do
NOWDIR=`echo $NOWFILE | cut -c $DIRCNT-`
echo "curl -T "$NOWFILE" http://<サーバーのFQDN or IP>/"$NOWDIR
done
exit 0
解説
まず最初のIF分で、このスクリプトを実行する時に引数を指定しなかった場合に処理を終了させます。
続いて変数の定義となりますが、DIRCNT
にてカレントディレクトリの文字数を代入しています。
詳細はこちらで説明しています。
なお、let DIRCNT++
では上記DIRCNT
の値に1を足していますが、後ほど登場するカレントディレクトリを削るコマンドで、カレントディレクトリの後ろの/
までを削るために1を足しています。
変数ALLFILES
にはカレントディレクトリの中にあるアップロード対象ディレクトリ内に存在するファイルやディレクトリのパスが格納されます。
変数FINDFILE
には上記変数を参照し、全ファイルのパスが格納されます。
for分についての解説です。
ループの条件は、作業対象ディレクトリ内に存在する全てのファイルに対する処理が完了するまで回し続けます。
このとき参照しているパスを変数NOWFILE
に格納します。
変数NOWDIR
には、現在参照しているファイルパスが格納された変数NOWFILE
を、cut
コマンドで指定された文字数分削った文字列が格納されます。
このcut
変数で削る文字数というのが、先程定義したDIRCNT
までとなっています。cut変数で指定した数値分文字を削除する際の書式はcut -c <開始位置>-<終了位置>
となりますが、終了位置を指定しない場合は一番うしろまでが対象となります。(逆に開始位置を指定しない場合は先頭からとなります)
例えば/home/user/dir/file
というパスに対して、cut -c 11-
というコマンドを実行した場合、dir/file
というパスが返ってきます。
これらを組み合わせることによって、NOWDIR
変数にはカレントディレクトリ直下の作業対象ディレクトリから格納対象ファイルまでのパスが代入されるようになります。
このファイルパスを整形するテクニック自体はこちらで紹介しています。
最後にechoコマンド内のcurlコマンドですが、アップロード対象ファイルはNOWFILE
変数で指定し、格納先のURLにはアップロード対象のディレクトリからアップロード対象ファイルまでのパスを追加するようにしています。
Artifactory等、curlコマンドでファイルのアップロードができるサービスで格納先のディレクトリまで指定できる場合にはこのようにNOWDIR
変数の中身を追加することでアップロード時にディレクトリ構成を維持してアップロードすることができます。
ちなみにこのスクリプトをこのまま実行するとcurlコマンドが表示されるだけですが、echo
とダブルクォートを外せばそのままcurlコマンドが実行されます。
アップロード対象の全ファイル容量次第ではサーバーやネットワークに負荷がかかってしまうので、ループの中にsleep
コマンドを挟んだほうが良いと思います。
以上です。