
現在、2つのディレクトリとサブディレクトリのファイルの変更を監視しようとしています。これらのディレクトリには同じファイルセットが含まれており、その一部は変更されました。だから私はそのdiff
コマンドを使って行番号と変更を含む変更されたファイルのリストを作成できると思いました。他のスクリプトでさらに処理するには、このリストが必要です。
このオプションを使用すると、変更を再帰的に確認できるため、diff -r
必要に応じて出力形式を指定してみました。デフォルトの複数行出力は利用できませんが、次のようにします。
file_1
:
my first line
my second line
my third line
file_2
:
my first line
my changed second line
my third line
私が望む出力は次のとおりです。
file_2:2:my changed second line
または(簡単なら):
file_1:2:my second line
file_2:2:my changed second line
次のパラメーターを使用して、ファイル名なしで出力を生成しました。
diff -qbBwr --unchanged-line-format="" --old-line-format=":%d:%L" --new-line-format=":%dn:%L" file_1 file_2
これにより
:2:my second line
:2:my changed second line
しかし、2つの問題があります。
- lfmt オプションは再帰オプションと一緒には使用できません。
-r
- ファイル名が出ません。
だから最後の質問は次のようになります。
diff
上記の目的の出力を取得する方法で2つのディレクトリを作成する方法を知っている人はいますか?
答え1
私はこれがあなたに必要なことをしなければならないと思います:
diff -r -U0 a/ b/ | awk '/^+++ / {filename=$2; next} /^@@ / {split($3,a,","); line=substr(a[1],2)} /^+/ {text=substr($0,2); print filename ":" line ":" text; line++}'
デフォルトでは、一般的な再帰比較を実行し、不要なビットを削除します。 awkはこんなことに良いです。
diff -U0
次の出力を提供します。
--- a 2014-07-01 17:05:46.257447351 +0100
+++ b 2014-07-01 17:05:56.157524562 +0100
@@ -2 +2 @@
-my second line
+my changed second line
awkスクリプトは+++
ファイル名、行の行番号@@
、行のテキストを取得し、必要な+
コロンで印刷します。
file_2:2:my changed second line
編集:2行を一緒に編集すると、スクリプトエラーが発生することがわかりました。これで解決しました。