Linuxコマンド・bashの使い方実例

Linuxコマンド・bashの使い方の実例を紹介します。
管理人は某企業で、一応SEとして働かせていただいております(本業は組み込み系)。
まだまだ未熟者ですが、皆さんのお役に立てたら幸いです。

patchコマンドで差分をマージするときなんかは、diffコマンドの結果はそのまま使えますが、
人が見るとき(主に業務でのレビュー時など)は、1つのファイルに差分が全部出力されると見辛いことがあります。

そこでディレクトリを再帰的に比較し、ファイルごとに差分を出力するスクリプトを作ってみました。
(参考:再帰的にdiffを取って1つのファイルに出力する方法はこちらを参照


■スクリプト(本体)
スクリプトのダウンロード

■スクリプトの実行方法
./diff_dir.sh [変更前ディレクトリ] [変更後ディレクトリ]

■スクリプトの説明
このスクリプトは、ディレクトリ指定で差分を取ることができ、
出力する差分は差分のあるファイルごとに出力されます。

差分を出力するディレクトリは、このスクリプトを実行した時のカレントディレクトリに、「DIFF_output」というディレクトリを作成し、そこに出力します。
この出力先のディレクトリが既にある場合、削除して作り直します。

出力するファイル名は、比較したファイル名に「_DIFF.txt」を付加して出力します。
子ディレクトリに含まれるファイルは、「ディレクトリ名_...」を付加して出力します(処理的には、ファイルパスに含まれるスラッシュをアンダーバーに変換する)。

出力先には、「DIFF_report.txt」というファイル差分の有無だけを出力したファイルを出力します。
ファイルの追加、削除などはこれを参照して確認できます。

■実行時の注意
このスクリプトはbashなどのBシェル系の文法で記載しているため、
/bin/sh が /bin/csh へのリンクになっている環境では、構文エラーになります。
その場合は、1行目(シェバング行と呼ばれ、スクリプトを読むインタプリタを指定する行)を、
#!/bin/bash へ変更してください。


説明は以上ですが、上記で使われている固定値(出力先ディレクトリ名など)は、
スクリプトを編集して自分なりに使ってみてください。

近いうちこのスクリプトの解説も行いたいと思います。
スポンサードリンク
スポンサードリンク

if文を書くほどでもない、ちょっとした条件分岐処理を行う場合、便利な方法があります。
以下のように実行します。

■ホームディレクトリにtmp3フォルダまたはファイルが無ければNot existと出力し、最後にENDと出力するコマンド
test -e ~/tmp3 || echo 'Not exist' ; echo 'END'

上記の「||」は、
直前の実行結果(echo $?の値)が真(0)であれば直後のコマンドは実行しません。
直前の実行結果が偽(非0)であれば直後のコマンドを実行します。
「;」は、直後のコマンドを(条件関係無く)連続して実行します。

これを利用することで、if文を使わなくとも、条件分岐を行うことができます。
シェルなどのスクリプトだけでは無く、コマンドラインでも使えるので、汎用性が高いです。

ちなみに、上記コマンド例のtestコマンドの実行結果を否定させることで、
「tmp3ディレクトリがあれば、実行する」とすることも可能です。

■ホームディレクトリにtmp3フォルダまたはファイルがあればExistと出力し、最後にENDと出力するコマンド
test ! -e ~/tmp3 || echo 'Exist' ; echo 'END'

また、「||」を複数使うことで、複数の条件をつけることも可能です。

■ホームディレクトリにtmp2、tmp3の両方が無ければNot existと出力、どちらかがあれば何も出力せず、最後にENDと出力するコマンド
test -e ~/tmp2 || test -e ~/tmp3 || echo 'Not exist' ; echo 'END'


要は、論理演算のorなんですよね。前のコマンドから順番に評価し、実行結果が真になったら、以降の評価はせずに、次のコマンドへ進む。
これらの構文を利用して、スクリプトを簡潔に記載したり、コマンドライン操作を効率化しましょう!
(ちなみに私はこの構文を忘れることが多いので、備忘録も兼ねて記事にさせていただきました。)
ただし、スクリプトで多用しすぎると、可読性が低くなることがありますので、
複雑な条件分岐で使うのは避けた方が良いでしょう。その場合は素直にif文を使った方が良いですね。 

psコマンドの実行結果って、直感ではわからない項目があったりしますよね。。
この記事では、psコマンドの実行結果で、それぞれの列が何を意味しているのかをまとめます。
全てのプロセスを表示する、下記psコマンドの実行結果を対象に解説します(恐らく一番よく使うオプション指定だと思うので)。 

■全てのプロセスを表示するpsコマンド
ps -ely
ps axu ←BSD系OSの場合はこちら。その他のOSの場合はps -elyを使ってください(理由は、場合によっては異なる解釈でコマンドが実行されることがあるためです)。
 
psコマンド実行結果
見出し指定子意味
S、STATsプロセスの状態。D→I/O待ちのスリープ、R→実行中、S→イベントの完了を待っている割り込み可能なスリープ、T→シグナル等による停止、W→ページング、Z→ゾンビ
BSD系の場合、次のフラグが付加される <→優先度が高い、N→優先度が低い、L→ページ(メモリ)がロックされている(主にリアルタイムOS)、s→セッションリーダー、l→スレッド、+→フォアグラウンドプロセスグループ
UIDuidユーザID
USERuserユーザ名
PIDpidプロセスID
PPIDppid親プロセスのプロセスID
CcCPU使用率
PRIpri優先度。数値が高いほど優先度が低い。
NIninice値。-20〜19の値。優先度が低いと数値が高い
RSSrssスワップされていない、使用済みの物理メモリ量(kbyte)
SZsz使用している物理メモリ量
WCHANwchanスリープしているカーネルの関数名
TTYtname制御している端末
TIMEtimeプロセスが開始してからの累積CPU時間
CMDcmd実行コマンド
VSZvsz仮想メモリ量

表にある指定子は、ps -eo オプション指定時に使います。
ps -eoオプションを使うと、psコマンドの実行結果をカスタマイズでき、見たい情報だけを出力することができます(ps -elyで出力されない列も表示させることができる)。

例)ユーザIDと、プロセスIDと、親プロセスIDと、実行コマンドを出力したい場合。
ps -eo user,pid,ppid,cmd

今回の記事はここまでですが、
この他にもpsコマンドは沢山の情報を出力できますので、
もし興味があれば、man psでマニュアルを読んでみると良いと思います。

※なお、本記事はpsコマンドの以下バージョンに基づいています。
procps-ng version 3.3.9
 

↑このページのトップヘ