未分類スクリプト

トップ > チップス > 未分類スクリプト
2012-02-13, other

/tips/bash/other **「-(ハイフン)」で始まるファイルを削除する 2006.5.16 :$ rm -- -foo : :$ rm ./-foo

**ファイルのエンコードを変更 最初の引数($1)に指定したファイルのエンコードをSJISにします。nkf単体だと必要なリダイレクトの手間を省いただけ。

:#! /bin/bash :nkf -s -O $\{1\} && mv nkf.out $\{1\}

>2008.04.17追記 >nkfの代わりに{link:/tips/linux/iconv,iconv}というコマンドを利用できます。 >iconvはFedoraにデフォルトでインストールされているようです。 **複数ファイル内の文字列を一気に置換 edを使って引数で指定(ワイルドカード利用可能)したファイル全てに対して文字列の置換を行います。

:#! /bin/bash :SRC=aaa :DST=bbb : :for file in $\{@\} :do :echo "$\{file\} .." :ed $\{file\} << EOF :1,\\$s/$\{SRC\}/$\{DST\}/g :w :q :EOF :done

対象のファイルを細かく指定したい、或いは予め確認したい場合はfindコマンドと組み合わせて利用します(replace.shが今回作ったスクリプト)。 :#! /bin/bash :SRC=aaa :DST=bbb : :echo "$\{1\} .." :ed $\{1\} << EOF :1,\\$s/$\{SRC\}/$\{DST\}/g :w :q :EOF

:$ find . -type f -exec replace.sh \{\} \\;

**フロッピーをマウント fstabに記載されていないデバイスをマウントする。 :$ mount /dev/fd0 /mnt/floppy

**バックグラウンドプロセスを管理する デーモンとしてバックグラウンド起動が必要なプログラムの実行を管理するための方法です。ホームディレクトリに「xxx.pid」というファイルを持ち、それを用いて起動・終了の状態を管理します。

startup.sh :#!/bin/bash :if [ -f $\{HOME\}/.xxx.pid ]; then : # プロセスファイルが存在する場合、PIDを読み取る : PID=`cat $\{HOME\}/.xxx.pid` : if (ps -xa -p $PID | grep $PID >/dev/null); then : # 同一のPIDがプロセスリストに存在する場合、処理を中断 : echo "$0 is already running." : exit 1 : fi :fi : :(/cmd ; rm $\{HOME\}/.xxx.pid) & :echo $! >$\{HOME\}/.xxx.pid

kill.sh :#!/bin/bash :if [ -f $\{HOME\}/.xxx.pid ]; then : # プロセスファイルが存在する場合、PIDを読み取る : PID=`cat $\{HOME\}/.xxx.pid` : if (ps -xa -p $PID | grep $PID >/dev/null); then : # 動作中のプロセスに終了シグナルを送る : kill PID : exit 0 : fi :fi :echo "$0 is not running now." :exit 1

十分に調査できていませんが、それ用の関数がfunctionsの中に定義されているようです。 :. /etc/init.d/functions :daemon foo.sh

:. /etc/init.d/functions :killproc foo.sh

**公開鍵を作成・送信する 現在ログインしているホストで鍵ペアを作成し、公開鍵を別のホストに送信する方法です。鍵を送信したホストとはパスフレーズによる認証ができるようになります(パスフレーズを省略し、直接ログインするようにもできます)。 :$ ssh-keygen -t rsa : (保管場所、パスフレーズ等を入力) :$ cat .ssh/id_rsa.pub | ssh -p {strong:22} {strong:user@hostname} "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys"

>ssh-copy-idというコマンド(スクリプト)が存在しますが、ポートの指定等に対応できないため、利用していません。

**古いファイルを圧縮・整頓する カレントディレクトリ以下の120日以上前に作成されたファイルをtar.gz形式で圧縮してから、削除します。

:$ find . -ctime +120 -exec tar rf ~/archive.tar {} \\; && gzip ~/archive.tar :$ find . -ctime +120 -exec rm {} \\;

恐らくxargsを使用したほうが動作は早いのですが、数十メガ程度のサイズならこれで十分実用的です。

**Yes,Noを選択するプロンプトを表示する $$2008.10.10 画面上に「Ok? (y/N)」と表示し、入力を待ちます。「yes(yだけや大文字も可)」と入力された場合とそれ以外(デフォルト)で処理を分岐するサンプルです。

:echo -n "Ok? (y/N) " :read ANS :case $\{ANS\} in [Yy]|[Yy][Ee][Ss]) : echo "Yes." : ;; :*) : echo "No." :esac

**他のユーザがログインしていないか調べる whoコマンドの結果から、現在ログイン中のユーザ数を調べ、他にユーザがいない(=ユーザ数が1)の場合だけ、指定したコマンドを実行するスクリプトです。下記例では、再起動を実行しています。 :if [ $(who | wc -l) = "1" ]; then : sudo /sbin/shutdown -r now && exit :else : echo "Other user(s) still logged in. Abort." :fi

**一定時間スリープする 1秒毎に「.」を出力するスクリプトです。whileで無限ループしているので「Fin」にはたどり着きませんが・・・。sleepコマンドを利用します。 :#! /bin/bash : :while :; do : echo -n "." : sleep 1 :done :echo "Fin."

この記事は役に立ちましたか?