小ネタです。
「いらすとや」さんのトランプ画像を使わせていただこうとしたら、1枚ずつ保存しなければならないようで心が折れそうになったため一括でダウンロードできるシェルスクリプトを組みました。……組んだのですが、URLのハッシュ値の法則性を解析するのが面倒だったので、結局すべてのURLのリストを作ることにw
せっかくなので別の方も利用されるかもしれないと思いコードを置いておきますね。悪用厳禁でお願いしますw
続きを読む
小ネタです。
「いらすとや」さんのトランプ画像を使わせていただこうとしたら、1枚ずつ保存しなければならないようで心が折れそうになったため一括でダウンロードできるシェルスクリプトを組みました。……組んだのですが、URLのハッシュ値の法則性を解析するのが面倒だったので、結局すべてのURLのリストを作ることにw
せっかくなので別の方も利用されるかもしれないと思いコードを置いておきますね。悪用厳禁でお願いしますw
続きを読む
一言で言えばGulpのようなタスクランナーっぽいことをmacOS上でやりたかったのです。
「Gulp入れればいいじゃん」という話もありますが、今回はファイルが更新されたら特定のコマンドを実行したいだけだったので、わざわざNode.jsの環境を整えてJavaScriptをガリガリ書くのはちょっと面倒だったんですよね。
macOSではファイルが更新されたか監視する際にfswatchを使うのが鉄板のようなので、こちらを利用します。
小ネタが続いてますが、今回も小ネタですw
Webサイトの改ざん検知を手軽にパパッと行いたい場合、単純にcurlなどで取得したファイルをdiffで比較するだけでも実現できます。
というわけで以下がコード。ここでは最終的にSlackに通知しています。
#!/bin/bash
#
# 簡易的な改ざん検知からのSlack投稿
#
# 対象ページ
TARGET_URL='https://blog.katsubemakito.net/'
# 投稿先のSlack URL
WEB_HOOK_URL='https://hooks.slack.com/services/xxxxxxxx/xxxxxxxx/xxxxxxxxxxxxxxxxxx'
# 保存先ディレクトリ
STORE_DIR='/home/katsube/'
#-----------------------------------
# 最新のHTMLを取得
#-----------------------------------
cd $STORE_DIR
curl -s $TARGET_URL -o current.html
if [ $? -ne 0 ]; then
echo "Can not get TARGET_URL: $TARGET_URL" >&2
exit 1
fi
#-----------------------------------
# 前回のファイルと比較する
#-----------------------------------
if [ -f ./prev1.html ]; then
result=`diff prev1.html current.html`
if [ -z ${result} ]; then
text="変化はありません"
else
text="<!channel> 変化がありました"
fi
# Slackに投げる
curl -X POST --data-urlencode "payload={\"text\": \"${text}\"}" $WEB_HOOK_URL
if [ $? -ne 0 ]; then
echo "Can not post Slack, diff is ${result}" >&2
exit 1
fi
fi
#-----------------------------------
# 今回取得したファイルの名称変更
#-----------------------------------
# 1世代残す
if [ -f ./prev1.html ]; then
mv prev1.html prev2.html
fi
mv current.html prev1.html
非常に簡易的な物ですので、実際に利用する場合は要件に応じてカスタマイズしてください。
続きを読む
Bashで特定のファイルを順番に処理したい場合、配列をforでぐるぐる回してやるのがお手軽です。ここでは配列listで定義した3つのファイルを順番に指定ディレクトリへコピーしています。
#!/bin/bash
# 対象のファイル一覧
list=(
/tmp/foo.txt
/tmp/bar.txt
/tmp/hoge.txt
);
# 順番に処理する
for file in ${list[@]}; do
echo "copy ${file} to /home/foo"
cp $file /home/foo
done
Bashでlsなどコマンドの実行結果を順番に処理したい場合は以下のようにforでぐるぐる回してやるだけです。
#!/bin/bash
for file in `ls /tmp/*.json`; do
echo "copy ${file} to /home/foo"
cp $file /home/foo
done
ここでは「/tmp」ディレクトリ配下にある拡張子が.json
のファイルを順番に指定ディレクトリへコピーしています。対象のファイルが存在しない場合は何もしません。
続きを読む
日次バッチなどを作っていると、例えばバックアップファイルは最新30件だけ保存し、それ以上古いファイルは削除したいといった気持ちになりますよね。そんな時に利用するのが次のワンライナー。
$ cd backup/
$ rm -f `ls -t . | tail -n+31`
これだと30日前の日付を計算して毎回削除するといった処理を書かなくて済みます。厳密にn日分確保する必要がある場合は日付の計算を行った方が良いでしょうが、念の為一定期間取っておきたいくらいのゆるい要件であれば十分でしょう。
-r
をつけてください。小ネタです。
シェルスクリプトを書いている際にwget
で正常にファイルをダウンロードできた場合のみ処理を継続したい場合には次のようなコードを書きます。
#!/bin/bash
wget 'https://example.com/foo.zip'
if [ $? -ne 0 ]; then
echo "[ERROR] 正常にダウンロードできませんでした"
exit 1
fi
$?
は直前のコマンドの実行結果が自動的に入ります。-ne
はnot equal
の略で、値が等しくない場合に使用します。何らかのAPIを延々と自然な形で叩き続けたいときがありますよね。え?ないw? ←
JMeterのようなテスト用のフレームワークを使っても良いのですがそこまでするのは準備が面倒だし、ApacheBenchのようにDDoS…もとい負荷テストをするわけでもないといった場合にはbashのようなシェルスクリプトをちょちょいと書いてやると簡単に実現できます。
こういった類いのプログラムをゲーム界隈では「bot」や「バッチ」と呼称しています。