ミッションたぶんPossible

どこにでもいるシステムエンジニアのなんでもない日記です。たぶん。

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

参考サイト:Basic認証でwget - cloned.log

処理を一定時間停止(スリープさせる)

 wgetで間をおかずファイルが取得できればいいんですが、まぁそんなことはないので、ダウンロードにかかる時間分処理を一時停止させます。これは「sleep」コマンドを使えばOK。単位を指定しなければ指定した数の秒数だけ処理を一時停止させますが、数字+「h」を指定すると時間単位で、数字+「m」で分単位、数字+「d」で日単位で指定できます。
 以下サンプル。

$ sleep 60

参考サイト:Linuxコマンド集 - 【 sleep 】 指定された時間,停止する:ITpro

圧縮ファイルを解凍する

 圧縮された.tgzを解凍するにはtarコマンドをzxvfオプションをつけて実行します。以下サンプル。

$ tar zxvf files.tgz

参考サイト:tar/zipコマンドで解凍・圧縮一覧まとめ(gz、zip、tar.xzなど)

ファイル名を取得する

 圧縮ファイルを展開すると山ほどファイルが入っているので、これらからファイル名のみ取得します。ファイル名はフルパスで取れちゃうので、ディレクトリ部分は削除してファイル名のみ抜き出します。ここからは単行では実行できないので、シェルスクリプトで。
 以下サンプル。圧縮ファイルは「/home/www/files」というディレクトリに展開したという前提で書きます。

#!/bin/sh

files="/home/www/files/*"
for filepath in ${files}
do
echo `basename ${filepath}`
done

参考サイト:全ては時の中に… : 【Linux】ファイルパスからファイル名を取得する

ファイルのプルパスのディレクトリ部分のみを取得する

 前述のファイル名のフルパスからファイル名部分のみ抜き出したのと逆ですね。ディレクトリ名を取得します。この場合は「dirname」コマンドを使うと簡単に取れます。以下サンプル、実行すると「home/www/files」が取得できます。

$ dirname /home/www/files/hogehoge.xml

参考サイト:ディレクトリ名やファイル名だけを取り出したい - ITmedia エンタープライズ

ファイル名を部分的に抜き出す

 ファイル名が長くて使いにくかったので、今回はリネーム(名前変更)することにしました。Javaのsubstringみたいなことをやるんですが、シェルスクリプトだと指定が楽ちんで、

str = "abcdefghij"
echo ${:0:3}

と言う風に書くと「abc」が取れます。

str = "abcdefghij"
echo ${str:2:3}

と言う風に書くと「cde」ですね。最初の数字が「何文字目から取得するか」、次の数字が「何文字取得するか」を指定します。


参考サイト:シェルスクリプトでsubstrみたいなこと - 半径5メートル

文字列を連結する

 上記で取得したファイル名の部分文字列と拡張子をくっつけてファイル名に仕立て上げます。今回は「.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 60

tar zxvf files.tgz
sleep 30

rm 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

 …コメント一切無しの漢らしいシェルスクリプトになったなぁ。(←ダメな例なのでちゃんとコメント書きましょう)
 そんなに使うシチュエーションが多いスクリプトだとも思えませんが、良かったら参考にしてみて下さい。