両方のディレクトリを比較して変更し、スクリプトで使用する出力形式を指定します。

両方のディレクトリを比較して変更し、スクリプトで使用する出力形式を指定します。

現在、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行を一緒に編集すると、スクリプトエラーが発生することがわかりました。これで解決しました。

おすすめ記事