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アーカイブ・同期・デバイス処理を参照のこと。