序文:
Linux で一般的に使用されるコマンドは 100 を超えてはいけません。したがって、Linux への参入の敷居は比較的低いです。しかし、マスターと下級者の違いは、その他の一見奇妙なコマンドの認識と適用にあります。たとえば、 , この記事ではこのdiffコマンドについて解説していきます。
コマンドをたくさん知ったからといって、すぐに Linux マスターになれるわけではありませんが、マスターは常に常人よりも高い位置にあり、基礎がしっかりしているため、視野はより遠くにあり、能力はより強力ですよね。
笑(^^^^_^^^^) ということで、私も今では何もないマスターです。
さて、ナンセンスな話はやめて、この非常に便利な diff コマンドについて詳しく説明しましょう。
一、
diff コマンドの目的と歴史
OK、大まかな歴史は C 言語から始まります。それはかなり昔、おそらく 560 年代からです。まあ、具体的な詳細についてはあまり覚えていませんが、前世紀の 80 年代に始まりました。カリフォルニア大学バークレー校が Unix の BSD バージョンを発表したとき、diff の表示結果は単純すぎるため、発生した変更を理解するにはコンテキストを追加した方がよいと考えました。したがって、コンテキスト形式の diff が導入されました。つまり、diff コマンドの出力が最適化されました。この観点から見ると、このコマンドは非常に古いものです。
diff コマンドは Unix システムの組み込みコマンドであり、非常に古いコマンドですが削除されることなく常に Unix システムに存在しています。したがって、実際には、この記事は新しいボトルに入った古いワインにすぎません。
次に、このコマンドは主にファイル (フォルダー) の内容を比較し、比較したファイルの内容がどこが異なるか、またはフォルダー内にどのファイルが存在するかを出力します。主にテキスト ファイルの場合、このコマンドはバイナリ ファイルの比較に使用します。は不適切であり、ここでは特別な注意が必要です。
二、
diffコマンドの出力形式と共通パラメータ
前回の記事では、コンテキスト形式の差分について簡単に説明しましたが、diff コマンドの出力は何でしょうか? 合計 4 つの形式があります。
通常形式 (オプション --normal)
サイドバイサイド形式 (オプション -y、--side-by-side)
コンテキスト形式 (オプション -C NUM、-c、--context[=NUM])
マージ形式 (オプション -U) NUM、-u、--unified[=NUM])
共通パラメータ:
c、u、y、w、W、Z、r
- -a, --text
すべてのファイルはテキスト ファイルとして扱われ、行ごとに比較されます。-B
、 --ignore-blank-lines は、 空白行の
挿入および削除によって生じた変更を無視します。 異なる数値によって生じる差異-C NUM -c, -- context[=NUM] コンテキスト形式を使用して出力し、異なる行の上下に指定された行数を表示します (デフォルトは 3 行) --color[=WHEN] は色を出力します; WHEN 可能な値は、never、always、またはauto (デフォルト) -D, --ifdef=NAME 「#ifdef NAME」とは異なるマージされたファイルを出力します-d, --minimal 変更アルゴリズムは、より小さな変更セットを検出します。これにより diff が遅くなります-E, --ignore-tab-expansion タブ 拡張による変更を無視します-e, --ed 有効な ed スクリプトとして出力します-F, --show-function-line=RE show は前の行と一致しますRE --from-file=FILE1 は FILE 1 をすべてのファイルと比較します。FILE 1 はディレクトリ--GTYPE-group-format=GFMTにすることができます
タイプ GTYPE の入力グループをグループ形式 GFMT でフォーマットします
--line-format=LFMT
すべての入力行をフォーマット LFMT でフォーマットします --LTYPE
-line-format=LFMT
タイプ LTYPE の入力行を行フォーマット LFMT でフォーマットします
上記 3 つの各オプションのフォーマット応答により、出力をきめ細かく制御できます。
行タイプ LTYPE は値 old、new、または変更なしを取ることができ、グループ タイプ GTYPE は値 LTYPE または変更された値を取ることができます。
グループ形式 GFMT には、特に次の内容が含まれます:
%<line in FILE1
%>line in FILE2
%= FILE1 と FILE2 の両方に共通の行
%[-][WIDTH][.[PREC]]{doxX}LETTER は
printf 出力スタイルを使用しますLETTER を変更します。LETTER は次の文字を使用して新しいグループを示し、以下の小文字は古いグループを示します。
F 最初の行番号
L 最後の行番号
N 行数 = L-F+1
E は F-1 に等しい
M はL+1
%(A= B?T:E)に等しい
A が B に等しい場合は T、それ以外の場合は E
行フォーマット LFMT には、具体的には次の内容が含まれます:
%L 行の内容
%l 末尾の改行文字を除く行の内容
%[-][WIDTH][.[PREC]]{doxX}n
printf スタイルを使用します。入力行番号を変更します。 n
グループ形式 GFMT と行形式 LFMT の共通内容:
%% はパーセント記号を意味します。 %
%c'C' は大文字の C
を意味します。 %c'\OOO' はコード値 8 進数 000 の文字 C を意味します。
その他の文字
--help
ヘルプ情報を表示して終了します
--horizon-lines=NUM
共通のプレフィックスとサフィックスを持つ NUM 行を保持します
-I, --ignore-matching-lines=RE
正規表現に一致する行を無視 しますRE
-i, --ignore-caseignore case- -ignore-file-name-case ファイル名を比較するときに大文字と小文字を無視します-l, --paginate 結果を pr プログラムに送信してページ分割します--label LABEL 比較結果を出力するときにファイル名とタイムスタンプの代わりに LABEL を使用します--left -桁
共通行の左列のみを出力します
-N、--new-file は、
存在しないファイルを空のファイルとして扱います。ディレクトリを比較するときに、ファイル A が特定のディレクトリにのみ存在する場合、プリセットには「ディレクトリ内のみ: ファイル A」と表示されます。-N パラメータを使用すると、diff はファイル A を空のファイル
-n と比較します。 --rcs は
比較結果を RCS 形式で表示します。
--no-dereference
は解析しません
--no-ignore-file-name-case
ファイル名を比較するときに大文字と小文字が区別されます。
--normal は
、通常の形式を使用して比較結果を出力します。デフォルトの出力形式
-p、--show-c-functionでは
、C 関数
--palette=PALETTEの各変更が表示されます
。 --color オプションを使用する場合、使用する色を指定します。パレットは、ターミナルでサポートされる機能のコロンで区切られたリストです。
-q, --brief
ファイルが異なる場合のみレポートし、差異の詳細は無視します。
-r, --recursive
ディレクトリを比較するときは、サブディレクトリを再帰的に比較します
。 -S, -- starting-file=FILE
ディレクトリを比較する場合は、FILE から開始します。これは、中断された比較を続行するために使用されます
。 -s, --report-identical-files
2 つのファイルが同一である場合に報告します。
--speed-large-files は
、ヒューリスティック ルールを使用して、多くの個別の小さな違いがある大きなファイルの操作を高速化します。
--strip-trailing-cr 入力行の末尾にある
キャリッジ リターン CR を削除します。共通行を出力します。 -T、--initial- tab 整列のために各行の前にタブを追加します-t, --expand-tabs 出力時にタブをスペースに展開します--tabsize=NUM タブは NUM (デフォルト 8) 個のスペースを意味します--to-file=FILE2 すべてのファイルを FILE2 と比較します; FILE2 はディレクトリにすることができます-U NUM -u, --unified[=NUM] マージ形式で出力、統一コンテキストの NUM (デフォルト 3) 行を出力--unidirectionion-new-file 存在しないファイルの最初のバッチを空として扱いますfiles -v, --version バージョン情報を出力して終了-W, --width=NUM -y オプションを使用して列形式で出力する場合、列幅を指定します。デフォルトは 130 です-w, --ignore-all-space 行を比較するときに空白を無視します
-y, --side-by-side
2 つの列を使用してフォーマットします
-Z, --ignore-trailing-space
末尾の空白を無視します
三つ、
ノーマルモード
この記事では、類似性の高い 2 つのテキスト ファイルを例として説明します。ファイルの内容は次のとおりです。
ファイル:
[root@centos61 media]# cat -A -n index.php
1 <?php$
2 /**$
3 * Front to the WordPress application. This file doesn't do anything, but loads$
4 * wp-blog-header.php which does and tells WordPress to load the theme.$
5 *$
6 * @package WordPress$
7 */$
8 $
9 /**$
10 * Tells WordPress to load the WordPress theme and output it.$
11 *$
12 * @var bool$
13 */$
14 define( 'WP_USE_THEMES', true );$
15 hello World!!!!!~~$
16 /** Loads the WordPress Environment and Template */$
17 require( dirname( __FILE__ ) . '/wp-blog-header.php' );$
B ファイル:
[root@centos61 media]# cat -A -n index.php.back
1 <?php$
2 /**$
3 * Front to the WordPress application. This file doesn't do anything, but loads$
4 * wp-blog-header.php which does and tells WordPress to load the theme.$
5 *$
6 * @package WordPress$
7 */$
8 $
9 /**$
10 * Tells WordPress to load the WordPress theme and output it.$
11 *$
12 * @var bool$
13 */$
14 define( 'WP_USE_THEMES', true );$
15 $
16 $
17 $
18 hello World!!!!!~~ $
19 /** Loads the WordPress Environment and Template */$
20 require( dirname( __FILE__ ) . '/wp-blog-header.php' );$
cat コマンドによると、B ファイルには 11 の異なる行があり、さらに 15、16、17 行があり、18 行目の内容にはさらにいくつかのスペースがあることが肉眼でわかります。 diffコマンドは言うのですか?
[root@centos61 media]# diff index.php index.php.back
11c11
< *
---
> *
15c15,18
< hello World!!!!!~~
---
>
>
>
> hello World!!!!!~~
OK、この出力は非常に単純なので、ほとんどの人はおそらく理解していません。では、それは正確には何を意味するのでしょうか?
1.11c11
これは、B ファイルの 11 行に対応して、A ファイルの 11 行が変更されたことを意味します。
2. < これは A ファイルを参照する方向を示し、下の > も B ファイルを参照する方向を示します。これは、diff コマンドが diff A B であるためです。
3、---は最初の部分の違いで、簡単に言えば区切り文字ですので、最初の4行は11行あるAファイルの方がBファイルよりもスペースが1つ少ないことを示しています。
4,15c15,18 は、2 つのファイルの 15 行目と 18 行目が異なることを意味します。具体的な違いは、A の 15 行目の内容が 18 行目にあり、B 行 (15 行目) にはさらに 3 行の空白行があることです。 -18
ファイルは次のように変更されます。
[root@centos61 media]# cat -A -n index.php
1 <?php$
2 /**$
3 * Front to the WordPress application. This file doesn't do anything, but loads$
4 * wp-blog-header.php which does and tells WordPress to load the theme.$
5 *$
6 * @package WordPress$
7 */$
8 $
9 /**$
10 * Tells WordPress to load the WordPress theme and output it.$
11 *$
12 * @var bool$
13 */$
14 define( 'WP_USE_THEMES', true );$
15 hello World!!!!!~~$
16 /** Loads the WordPress Environment and Template */$
17 require( dirname( __FILE__ ) . '/wp-blog-header.php' );$
B ファイルは次のように変更されます。
[root@centos61 media]# cat -A -n index.php.back
1 <?php$
2 /**$
3 * Front to the WordPress application. This file doesn't do anything, but loads$
4 * wp-blog-header.php which does and tells WordPress to load the theme.$
5 *$
6 * @package WordPress$
7 */$
8 $
9 /**$
10 * Tells WordPress to load the WordPress theme and output it.$
11 *$
12 * @var bool$
13 */$
14 define( 'WP_USE_THEMES', true );$
15 1111$
16 $
17 $
18 hello World!!!!!~~ 111$
19 require( dirname( __FILE__ ) . '/wp-blog-header.php' );$
20 1111111111111222222222$
21 333333333333333333$
もう一度比較してください:
[root@centos61 media]# diff index.php index.php.back
11c11
< *
---
> *
15,16c15,18
< hello World!!!!!~~
< /** Loads the WordPress Environment and Template */
---
> 1111
>
>
> hello World!!!!!~~ 111
17a20,21
> 1111111111111222222222
> 333333333333333333
全体の出力結果から、数字と文字 (11c11、15、16c15、18 など) によって 3 つの部分に分割されます。
- 11c11
< *
---
> *
ここでは、左側のファイルの 11 行がスター、右側のファイルの 11 行がスペース + スターであることを意味します
- 15,16c15,18
< hello World!!!!!~~
< /** WordPress 環境とテンプレートをロードします */
---
> 1111
>
>
> hello World!!!!!~~ 111
ここでは、左側のファイルの15行目と16行目の内容を、右側の15行目から18行目の4行に変更することを意味します。
- 17a20,21
> 1111111111111222222222
> 333333333333333333
つまり、左側のファイルの 17 行目以降に、右側のファイルの 20 行目と 21 行目を追加するだけです。つまり、 次の内容 (これらの数字) を左側のファイルの 20 行目と 21 行目に追加すると、次のようになります。右のファイルと同じです。
出力には、11 行と 15、18c15、16 が変更され、A ファイルの行数が B ファイルよりも 20 行と 21 行少ないことが示されています。次に、比較順序が変更されると、出力も変更されます。
[root@centos61 media]# diff index.php.back index.php
11c11
< *
---
> *
15,18c15,16
< 1111
<
<
< hello World!!!!!~~ 111
---
> hello World!!!!!~~
> /** Loads the WordPress Environment and Template */
20,21d17
< 1111111111111222222222
< 333333333333333333
20,21d17 は、左側のファイルが次のコンテンツ (これらの数字) を削除し、17 行のみが右側のファイルと一致することを意味します。
四、
コンテキストモード----コンテキストモード
パラメーター c を追加するとコンテキスト モードになります。コンテキスト モードはおおよそ次のようになります (上記の変更されたサンプル ファイルを引き続き使用します)。
[root@centos61 media]# diff -c index.php index.php.back
*** index.php 2023-05-13 23:22:41.638404080 +0800
--- index.php.back 2023-05-14 00:23:43.814240804 +0800
***************
*** 8,17 ****
/**
* Tells WordPress to load the WordPress theme and output it.
! *
* @var bool
*/
define( 'WP_USE_THEMES', true );
! hello World!!!!!~~
! /** Loads the WordPress Environment and Template */
require( dirname( __FILE__ ) . '/wp-blog-header.php' );
--- 8,21 ----
/**
* Tells WordPress to load the WordPress theme and output it.
! *
* @var bool
*/
define( 'WP_USE_THEMES', true );
! 1111
!
!
! hello World!!!!!~~ 111
require( dirname( __FILE__ ) . '/wp-blog-header.php' );
+ 1111111111111222222222
+ 333333333333333333
結果は次のように分析されます。
最初の部分の 2 行は、2 つのファイルの基本的な状況、つまりファイル名と時間情報を示しています。
***index.php 2023-05-13 23:22:41.638404080 +0800
---index.php.back 2023-05-14 00:23:43.814240804 +0800アスタリスクは A ファイルを意味し、--- は B ファイルを意味します
第二部
*** 8,17 **** は、A ファイルの 8 ~ 17 行を意味します
--- 8,21 ---- Bファイルの8行目から21行目を示します。
- 前者に表示され、後者の行が前者より 1 行少ないことを示します
+ 後者に表示され、後者の行が前者より 1 行多いことを示します
! 両方に表示され、異なる行があることを示します
OK、コンテキスト モードの出力は、通常モードの出力より理解しやすいようです。
五、
マージ モード - 統合モードとも呼ばれます
このモードは出力を簡素化します。特に 2 つのファイル間の類似性が高い場合、多くの出力が節約され、出力はより簡潔になりますが、それでも直感的ではありません。パラメーター u を使用するだけです。
[root@centos61 media]# diff -u index.php index.php.back
--- index.php 2023-05-13 23:22:41.638404080 +0800
+++ index.php.back 2023-05-14 00:23:43.814240804 +0800
@@ -8,10 +8,14 @@
/**
* Tells WordPress to load the WordPress theme and output it.
- *
+ *
* @var bool
*/
define( 'WP_USE_THEMES', true );
-hello World!!!!!~~
-/** Loads the WordPress Environment and Template */
+1111
+
+
+hello World!!!!!~~ 111
require( dirname( __FILE__ ) . '/wp-blog-header.php' );
+1111111111111222222222
+333333333333333333
出力の説明:
最初の部分はファイルの基本情報でもあります。— は最初のファイルを示し、+++ は 2 番目のファイルを示します。「---」は変更前のファイル、「+++」は変更後のファイルを示します。
2 番目の部分は @@ で囲まれた内容で、-8,10 は出力内容が最初のファイルの 8 行目から 10 行目に属することを意味し、+8,14 は出力内容が最初のファイルの 8 行目から 14 行目に属することを意味します。 2番目のファイル。
3 番目の部分は、比較後のマージされたコンテンツです。マイナス記号 - 後者の行数が前者よりも少ないことを示し、プラス記号は後者の行数が前者よりも多いことを示します。実際にはパラメータ u の後にデフォルト値 3 があり、つまりデフォルトの 3 行のコンテキストが出力されます。たとえばコンテキストを 1 行だけ変更したい場合は、コマンドは diff -u1 Index です。 phpインデックス.php.back
[root@centos61 メディア]# diff -u1index.phpindex.php.back
---index.php 2023-05-13 23:22:41.638404080 +0800
+++index.php.back 2023-05-14 00 :23:43.814240804 +0800
@@ -10,3 +10,3 @@
* WordPress テーマをロードして出力するように WordPress に指示します。
- *
+ *
* @var bool
@@ -14,4 +14,8 @@
define( 'WP_USE_THEMES', true );
-hello World!!!!!~~
-/** WordPress 環境とテンプレートをロードします */
+1111
+
+
+hello World!!!!!~~ 111
require( dirname( __FILE__ ) . '/wp-blog- header.php' );
+1111111111111222222222
+333333333333333333
六、
パラレルモード
パラメーター y と -W を組み合わせて出力幅を指定します (デフォルトは 130 の間隔で、これは左右の結果間の距離を指します)。
[root@centos61 media]# diff -y -W 200 index.php index.php.back
<?php <?php
/** /**
* Front to the WordPress application. This file doesn't do anything, but loads * Front to the WordPress application. This file doesn't do anything, but loads
* wp-blog-header.php which does and tells WordPress to load the theme. * wp-blog-header.php which does and tells WordPress to load the theme.
* *
* @package WordPress * @package WordPress
*/ */
/** /**
* Tells WordPress to load the WordPress theme and output it. * Tells WordPress to load the WordPress theme and output it.
* | *
* @var bool * @var bool
*/ */
define( 'WP_USE_THEMES', true ); define( 'WP_USE_THEMES', true );
hello World!!!!!~~ | 1111
/** Loads the WordPress Environment and Template */ |
>
> hello World!!!!!~~ 111
require( dirname( __FILE__ ) . '/wp-blog-header.php' ); require( dirname( __FILE__ ) . '/wp-blog-header.php' );
> 1111111111111222222222
> 333333333333333333
例証します:
- 「|」は前後の2つのファイルの内容が異なることを示します
- 「<」は、次のファイルが前のファイルより 1 行少ないことを示します
- 「">」は、次のファイルの内容が前のファイルよりも 1 行多いことを示します
セブン、
ディレクトリを比較する
ディレクトリを比較する場合は比較的単純で、存在する場合のみです。
[root@centos61 media]# diff -r /etc/ /var/
Only in /etc/: adjtime
Only in /var/: adm
Only in /etc/: aliases
Only in /etc/: aliases.db
Only in /etc/: alternatives
Only in /etc/: anacrontab
Only in /etc/: asound.conf
Only in /etc/: audisp
要約:
実際の経験によれば、 diff コマンドは、最初に最も直観的なパラレル モードを使用し、次に通常モード、次にコンテキスト モード、最後に統合モードを使用することをお勧めします。