Linuxのdiffとpatch・テキスト処理に関する世界観です。
ファイルやテキストを比較するコマンド。開発中のソースコードの比較に便利。
diff -u before.txt after.txt > diff1.patch
-uはunified形式、-cはcontext形式で出力される。普通は-uを使う。
サブディレクトリまで再帰的に全部比較する場合は-rオプションを付ける。
diff -u -r before after > diff2.patch
ディレクトリの内容を比較する際には必ず-rを付ける。
また、-pオプションでC言語の関数名を表示できる。Linuxカーネルでは、1つのファイルに対するdiffは-up、複数のファイルに対するdiffは-uprNを付けることを推奨している。
diffは使えます。僕はWindowsでもcygwinをインストールしてdiffを使っています。
Windowsで使う場合は、オプション--strip-trailing-crをつけて改行コードCRを削除しましょう。
$ diff -ru --strip-trailing-cr dir1/ dir2/
ちなみに、Windowsで使えるサクラエディタにもDiffの機能があります。
diffで取った変更差分(パッチ)を、ディレクトリツリーに適用できるコマンド。
patch -u < diff1.patch
-uはunified形式、-cはcontext形式で適用される。
パッチの適用を元に戻すには-Rオプションを付ける。
また、「-d ディレクトリ」と指定することで、ディレクトリに対してパッチを適用できる。
patch -u -p1 -d before < diff2.patch
オプションに「-p数」を指定すると、その数だけパスからプレフィックスを取り除ける。
たとえば「-p1」とした場合、「before/foo/hoge.txt」であれば「foo/hoge.txt」というパスで適用できる。
ディレクトリにパッチを適用した場合、変更されたファイルは変更されるが、新規作成されたファイルは作成されないことに注意。diffに-Nオプションを付けることで、同名のファイルがない場合、空ファイルがあるのと同じ動作にすることができる。
diffのほかにも、comm(行ごとに比較)やcmp(1バイトごとに比較)などのツールがある。
splitは、サイズごとあるいは行数ごとにファイルを分割するコマンド。
csplitは、特定の文字列でファイルを分割するコマンド。
csplitを使うことで、こんな風に出来る。
$ cat mike.txt
-1章
三毛猫のミケは、今日もつまらない日々を生きていた。...
-2章
三毛猫のミケの親友、クロに大事件が起きる。...
-3章
ミケはクロを助けるため、異世界にひとり向かう。...
-4章
ミケはクロを探し求めて、魔界の中を彷徨う。...
-5章
ミケはクロを発見するが、そこにはラスボスが待ち構えていた。...
$ csplit mike.txt /^-[1-5]章/ {*}
上を実行すると、「xx00」から「xx05」という名前でファイルが作成される。
ただし、この例ではファイルの先頭に「-1章」があるため、ゼロバイトのファイルxx00が作成されてしまう。これを作成したくない場合は-zオプションを付ける。
(テキストファイルを任意の文字列で分割するには - @ITを参考に執筆・編集して引用しました。)
テキストをソートするコマンド。シェルから実行できるほか、viなどで:1,10!sortとすれば、1~10行目をソートできる。
Linuxコマンド(ユーザープログラム)やviを参照のこと。
MD5/SHA1のハッシュ値(ファイルの整合性を保証する値)を表示する。
MD5/SHA1ハッシュはLinuxディストリビューションのISOファイルのダウンロードの際などに使われており、ファイルが壊れていないか(あるいは改竄されていないか)のチェックに使うことができる。
ファイル内容が完全に同じであれば、同じハッシュ値となる。もし少しでも壊れていれば、ハッシュ値は同じにならない。
暗号も参照のこと。
そのほか、
| コマンド | 説明 |
|---|---|
| uuencode/uudecode | バイナリデータのエンコード処理。 |
| base64 | base64エンコード処理。 |
などのコマンドがある。
2024.10.06編集
ソースからのインストールを参照のこと。
Linuxアーカイブ・同期・デバイス処理を参照のこと。