bash

「いらすとや」さんのトランプ画像をまとめてダウンロードする

小ネタです。

いらすとや」さんのトランプ画像を使わせていただこうとしたら、1枚ずつ保存しなければならないようで心が折れそうになったため一括でダウンロードできるシェルスクリプトを組みました。……組んだのですが、URLのハッシュ値の法則性を解析するのが面倒だったので、結局すべてのURLのリストを作ることにw

せっかくなので別の方も利用されるかもしれないと思いコードを置いておきますね。悪用厳禁でお願いしますw

続きを読む

ScanSnap Homeの常駐プロセスを終了したい – macOS版

小ネタです。
PFUのスキャナ「ScanSnap」を10年ほど愛用してまして、もう数百冊以上の書籍やら10年分のあらゆる書類や郵便物をスキャンしてます。めっちゃ便利!思い出や資料として取っておかない物はためらわずにデータ化した方が良いですね。部屋から本棚が3つくらい無くなりましたw

で、ちょっと前にmacOS側から操作するためのアプリがリニューアルして「ScanSnap Home」になったのですが、なんとこのアプリ終了することが出来ないんですよ。使い勝手自体は悪くないのですがバックグラウンドでずっと起動し続けるのが非常に気持ち悪い。しかもOSが起動すると勝手に立ち上がるのでインストールしたが最後、呪いにでもかかった気分ですw

がまん出来なくなってPFUへ問い合わせたところ、次の回答をいただきました。

誠に申し訳ございませんが、ScanSnap Homeで常駐プロセスを
自動起動しないようにする設定や機能、操作等はございません。

あー、ですよねー。と思ったら

ScanSnap Homeの常駐プログラムを自動起動しないようにする
ことはできませんが、本メールに添付したスクリプトファイルを
使用してScanSnap Homeの常駐プログラムを一括終了すること
は可能でございます。

なんやて! (゚д゚)

早速添付ファイルの中身を開いて確認すると単なるシェルスクリプトだったためメモ代わりにブログにも置いておきます。同じ現象で気持ちの悪い思いをされている方の参考になれば。
続きを読む

[macOS] Terminalでファイルを監視し更新されたら指定の処理をする – fswatch

一言で言えばGulpのようなタスクランナーっぽいことをmacOS上でやりたかったのです。

「Gulp入れればいいじゃん」という話もありますが、今回はファイルが更新されたら特定のコマンドを実行したいだけだったので、わざわざNode.jsの環境を整えてJavaScriptをガリガリ書くのはちょっと面倒だったんですよね。

macOSではファイルが更新されたか監視する際にfswatchを使うのが鉄板のようなので、こちらを利用します。


続きを読む

[Linux] bashで超簡易的な改ざん検知を行いSlackに投げる

小ネタが続いてますが、今回も小ネタです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

非常に簡易的な物ですので、実際に利用する場合は要件に応じてカスタマイズしてください。
続きを読む

[Linux] Bashでファイル一覧を順番に処理したい

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

続きを読む

[Linux] Bashでlsやfindの実行結果を1件ずつ処理したい

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のファイルを順番に指定ディレクトリへコピーしています。対象のファイルが存在しない場合は何もしません。
続きを読む

[Linux] Bashで一定件数以上のファイルを削除する

日次バッチなどを作っていると、例えばバックアップファイルは最新30件だけ保存し、それ以上古いファイルは削除したいといった気持ちになりますよね。そんな時に利用するのが次のワンライナー。

$ cd backup/
$ rm -f `ls -t . | tail -n+31`

これだと30日前の日付を計算して毎回削除するといった処理を書かなくて済みます。厳密にn日分確保する必要がある場合は日付の計算を行った方が良いでしょうが、念の為一定期間取っておきたいくらいのゆるい要件であれば十分でしょう。

  • 保存しておきたいファイル数に「+1」することをお忘れなく。
  • ディレクトリを削除する場合はrmに-rをつけてください。

続きを読む

[Linux] MD5の値を大量にチェックする

小ネタです。
例えばsplitコマンドなどで分割したファイルをダウンロードした際に、一つ一つMD5の値を確認するのはダルいですよね。md5sumコマンドでは、予め検証したいファイルのパスとそのMD5の値をペアで記述されたファイルを用意しておくと、一発で確認することでができます。

定義ファイルは以下のようにMD5値と、ファイルのパスを半角スペースなどで区切って書きます。

$ cat MD5SUM
f64062373f79e3fdabed57f6aec6d54d data/foo.zip.1
89063c79371e866afe627ddc221d3a9e data/foo.zip.2
993e1252af0e1fbd2435dcadd2a9fead data/foo.zip.3

あとは-cオプションでこの定義ファイルを渡せば自動的にチェックしてくれます。

$ md5sum -c MD5SUM
data/foo.zip.1: OK
data/foo.zip.2: OK
data/foo.zip.3: OK

続きを読む

[Linux] Bashでwgetの戻り値をチェックする

小ネタです。
シェルスクリプトを書いている際にwgetで正常にファイルをダウンロードできた場合のみ処理を継続したい場合には次のようなコードを書きます。

#!/bin/bash

wget 'https://example.com/foo.zip'

if [ $? -ne 0 ]; then
  echo "[ERROR] 正常にダウンロードできませんでした"
  exit 1
fi
  • $?は直前のコマンドの実行結果が自動的に入ります。
  • 比較演算子の-nenot equalの略で、値が等しくない場合に使用します。

続きを読む

bashで知能指数の低いbotを作成する

何らかのAPIを延々と自然な形で叩き続けたいときがありますよね。え?ないw? ←

JMeterのようなテスト用のフレームワークを使っても良いのですがそこまでするのは準備が面倒だし、ApacheBenchのようにDDoS…もとい負荷テストをするわけでもないといった場合にはbashのようなシェルスクリプトをちょちょいと書いてやると簡単に実現できます。

こういった類いのプログラムをゲーム界隈では「bot」や「バッチ」と呼称しています。

続きを読む