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

Linuxコマンド・bashの使い方の実例を紹介します。
管理人は現役ITエンジニアとして働いております(本業は組み込み系)。
かれこれ10年以上ITエンジニアとしてのキャリアを積んできました。
まだまだ未熟者ですが、皆さんのお役に立てたら幸いです。

タグ:diffコマンド

業務では、あるファイルに対する変更を、別のファイルにも適用する機会が多くあります。
こういった単純作業は、自動化して(パッチを当てて)一瞬で終わらせてしまいましょう。

ここでは、diffコマンドで作成したパッチを、patchコマンドで適用する方法を紹介します。


■パッチ(差分ファイル)を作成する

diff -ru [変更前ディレクトリ] [変更後ディレクトリ] > patch_work

解説:
変更前にディレクトリごとバックアップをとっておいたことを前提として、
ディレクトリ単位で差分patch_workに出力します。

rオプションは、サブディレクトリに含まれるファイルも再帰的に比較するために指定します。

uオプションは、差分をユニファイドdiff形式で出力するために指定します。

patch_workにリダイレクト(>)で出力していますが、ファイル名は何でも構いません。


■パッチを当てる

patch -u  -p 1 -d [パッチを当てるディレクトリ] < patch_work

解説:
uオプションはユニファイドdiff形式のパッチを当てる場合に指定します。

pオプションは、パッチファイルに記載されているファイルパスの階層を無視する数を指定します。

この例だと、-p 1と指定しているため、パッチファイルに記載されているファイルパスが
src_dir/test.txt と記載されている場合、1階層分のsrc_dirが無視され、
カレントディレクトリにあるtest.txtとしてpatchコマンドは認識します。

pオプションを指定する理由は、次のdオプションを使うためです。

dオプションの意味は、
「指定されたディレクトリへ移動してpatchコマンドを実行する」という意味です。

このように、pオプションとdオプションを組み合わせることで、
パッチに記載されているディレクトリ名と、パッチを当てたいディレクトリ名が異なる場合でも、パッチを当てることができます。
少しわかりにくいかもしれませんが、実際にコマンドを実行してみると理解できると思います。

patchコマンドを実行すると、SuccessやFailerなどの文字が出力されます。
これは、パッチが正しく「当たった」か、「当たらなかった」かを表しています。
パッチが「当たらなかった」時は、当たらなかったファイルの同階層に、
.rej拡張子のファイルが出力されます(ファイルの検索は目視ではなくfindコマンドを使用しましょう)。
このファイルに、当たらなかった差分が出力されているので、
手動でその差分を目的のファイルにマージしてください。

なお、パッチが「当たらない」場合とは、
パッチに記載されている差分の前後3行に一致する行が無かった場合か、
逆に一致する行が複数あってどこに当てるべきか判断できない場合などです。
対処として、パッチの作成時に前後の出力する行数をUオプションなどで調整したりします。


解説は以上です。
私の説明が下手でわかりにくいかもしれませんが、
たった2つのコマンドしか実行していません。

非常によく使う、強力なコマンドですので、
Linuxを使う方はぜひ活用し、作業を効率化しましょう。

スポンサードリンク
このエントリーをはてなブックマークに追加
スポンサードリンク

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

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


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

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

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

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

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

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

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


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

近いうちこのスクリプトの解説も行いたいと思います。
このエントリーをはてなブックマークに追加

↑このページのトップヘ