Unixでディレクトリを比較の行番号と並べて再帰的に比較するには?

Unixでディレクトリを比較の行番号と並べて再帰的に比較するには?

私のシナリオは、次のコマンドを使用してdiffディレクトリを並べて実行することです。

diff -ry <folder1> <folder2>

diff 出力の行番号。デフォルトでは、行番号は並列比較には表示されず、このパラメータはでのみ--new-line-format使用できません。diff -ydiff -u

私が試したのは[ファイルのみ]です。

diff -y <(cat -n file1) <(cat -n file2)

行番号を生成します。上記のコマンドは最初に行番号を生成し、それをdiffコマンドに渡すため、diff結果の行番号は変更されません。

しかし、いざ使用したときにdiff -ryできることは何もありませんでした。xargsコマンドで同様の[プリプロセッサなど]を使用してcat -nを適用する方法はありますかdiff -ry

答え1

インラインdiff -ru 出力を並列プレゼンテーションに変換できます。行番号を含むPythonプログラムcdiffとも呼ばれる色を使用して色を指定します。cdiff.pycdiff(のラッパーと混同しないでくださいcolordiff)、作者:Matthew Wang。

リンクに記載されている提案されたインストール方法に従って、またはcdiff.pyダウンロードしたスクリプトをPATHに抽出してから、次のことができます。

diff -ru dir1 dir2 | cdiff.py -s

答え2

スティーブン・ハリス素晴らしい答えが提供されました。この質問の以前のバージョン。残念ながら、改行文字を含むファイル名の病理学的ケースは処理されません。これは、この出来事に対処する彼の答えを少し修正したものです。 (cat -n代わりにnl、オプションを使用するように変更したりしました-ydiff

find folder1 -type f -exec bash -c 'for file1
do
  file2="${file1/folder1/folder2}"
  echo "Comparing $file1 to $file2"
  diff -y <(cat -n "$file1") <(cat -n "$file2")
done' bash {} +

xargsStephenの答えに対するコメントで解決策を求めたので、次のことができます。

find folder1 -type f -print0 | xargs -0 bash -c 'for file1
do
  file2="${file1/folder1/folder2}"
  echo "Comparing $file1 to $file2"
  diff -y <(cat -n "$file1") <(cat -n "$file2")
done' bash

ちなみに、これらのコマンドはPOSIXシェルがサポートされていないためGNU環境で完了する必要があり、bashPOSIXがサポートされていないため、ソリューションはGNU環境で完了する必要があります。 (もちろん、次に置き換えて削除できますが、改行文字を含むファイル名を処理する機能が失われます。)${parameter/pattern/string}xargsfind -print0xargs -0-print0-print-0

関連情報