2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

階層構造を維持したままcurlコマンドでアップロードする方法 解説

Posted at

前回の続きとなります。
以下のスクリプトを紹介しましたが、それの解説となります。

# !/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コマンドを挟んだほうが良いと思います。

以上です。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?