Linuxで別サーバから取ってきた圧縮ファイルを展開してファイルをリネームして再配置する
相変わらずブログを放置しててすみません。DevLOVE現場甲子園が終わるまではちょっとブログまで手が回らない状態です。(そもそも現時点でスライドが未完成という危機的状況)
さて、ちょっと仕事で掲題のようなバッチ処理を作る必要があったんですが、次にこんなことがあった時に調べ直すのがメンドイので、メモ的に書いておきます。
Basic認証のかかっているサーバから圧縮ファイルを取得する
wgetコマンドで取得します。Basic認証がかかっている場合には、「--http-user」オプションと「--http-passwd」オプションでID/PWを指定します。以下サンプル。Basic認証のID/PWは「takigawa/youichi」だという前提です。
$ wget --http-user=takigawa --http-passwd=youichi http://hogehoge.com/files.tgz
処理を一定時間停止(スリープさせる)
wgetで間をおかずファイルが取得できればいいんですが、まぁそんなことはないので、ダウンロードにかかる時間分処理を一時停止させます。これは「sleep」コマンドを使えばOK。単位を指定しなければ指定した数の秒数だけ処理を一時停止させますが、数字+「h」を指定すると時間単位で、数字+「m」で分単位、数字+「d」で日単位で指定できます。
以下サンプル。
$ sleep 60
圧縮ファイルを解凍する
圧縮された.tgzを解凍するにはtarコマンドをzxvfオプションをつけて実行します。以下サンプル。
$ tar zxvf files.tgz
ファイル名を取得する
圧縮ファイルを展開すると山ほどファイルが入っているので、これらからファイル名のみ取得します。ファイル名はフルパスで取れちゃうので、ディレクトリ部分は削除してファイル名のみ抜き出します。ここからは単行では実行できないので、シェルスクリプトで。
以下サンプル。圧縮ファイルは「/home/www/files」というディレクトリに展開したという前提で書きます。
#!/bin/sh
files="/home/www/files/*"
for filepath in ${files}
do
echo `basename ${filepath}`
done
ファイルのプルパスのディレクトリ部分のみを取得する
前述のファイル名のフルパスからファイル名部分のみ抜き出したのと逆ですね。ディレクトリ名を取得します。この場合は「dirname」コマンドを使うと簡単に取れます。以下サンプル、実行すると「home/www/files」が取得できます。
$ dirname /home/www/files/hogehoge.xml
ファイル名を部分的に抜き出す
ファイル名が長くて使いにくかったので、今回はリネーム(名前変更)することにしました。Javaのsubstringみたいなことをやるんですが、シェルスクリプトだと指定が楽ちんで、
str = "abcdefghij"
echo ${:0:3}
と言う風に書くと「abc」が取れます。
str = "abcdefghij"
echo ${str:2:3}
と言う風に書くと「cde」ですね。最初の数字が「何文字目から取得するか」、次の数字が「何文字取得するか」を指定します。
文字列を連結する
上記で取得したファイル名の部分文字列と拡張子をくっつけてファイル名に仕立て上げます。今回は「.xml」をくっつけました。以下サンプル。
str = "abcdefghij"
echo ${str:2:3}".xml"
これで「cde.xml」という文字列が取得できます。
参考サイト:UNIX : bash
ファイル名を変更する
これは基本中の基本ですね。「mv」コマンドを使います。元ファイルを壊してしまうことを心配するのであれば「cp」コマンドで複製を作ってそちらの名前を変更する方が安全ですね。以下サンプル…は「cp」コマンドで書きました。
$ cp /home/www/files/hogehoge.xml /home/www/files/fugafuga.xml
参考サイト:
まとめ
上記を一度にやるとこんなシェルスクリプトになりました。ちょいちょい「rm」コマンドでゴミ掃除をしています。
#!/bin/sh
cd /home/www/files
rm /home/www/files/*wget --http-user=takigawa --http-passwd=youichi http://hogehoge.com/files.tgz
sleep 60tar zxvf files.tgz
sleep 30rm files.tgz
files="/home/www/files/*"
for filepath in ${files}
do
filename=`basename ${filepath}`
directoryname=`dirname ${filepath}`
new_filename=${filename:0:10}".xml"
cp -p ${filepath} ${directoryname}"/"${new_filename}
done
…コメント一切無しの漢らしいシェルスクリプトになったなぁ。(←ダメな例なのでちゃんとコメント書きましょう)
そんなに使うシチュエーションが多いスクリプトだとも思えませんが、良かったら参考にしてみて下さい。