2016-07-03 13 views
1

すべてのファイルの最初の行を無視することを除いて、私はdiffしたいファイルの2つのフォルダを持っています。私は試しました最初の行を無視して2つのフォルダにあるファイルを比較します

diff -Nr <(tail -n +1 folder1/) <(tail -n +1 folder2/) 

しかし、明らかに正しい方法ではありません。

+1

のcp -r' 'との2つのフォルダを再帰的にコピーを作成し、次に使用について' -exec sedの-i 1dは{}見つける何\; 'コピーから最初の行を削除します。通常の 'diff -r'を実行するよりも簡単です。 – choroba

答えて

2

あなたが無視したい最初の行はPOSIX正規表現で一致させることができる独特の形式を持っている場合は、無視するように指示するdiff--ignore-matching-lines=...オプションを使用することができますそれらの行。

これを実行しないと、あなたが望むアプローチはおそらくあなたの正確な要件に依存します。ファイルを「比較したい」と言いますが、その機能がサポートされている場合は、出力結果がdiff -Nrから得られるものと正確に一致する必要があります。 (たとえば、あなたは差分で行番号が正しく元のファイル内の行番号を識別するために必要なのですか?)

次のように最も正確に忠実なアプローチは、おそらく次のようになります。

  • コピーを各ディレクトリに新鮮な場所、cp --recursive ...を使用しています。
  • find -type f -exec sed -i '1 s/^/IGNORE_THIS_LINE::/' '{}' ';'のようなものを使用して、IGNORE_THIS_LINE::のようなマジック文字列を先頭に追加するように各ファイルの最初の行を編集します。
  • diff -Nr --ignore-matching-lines=^IGNORE_THIS_LINE:: ...を使用して結果を比較してください。
    • パイプsed s/IGNORE_THIS_LINE:://への出力、まだ(非無視違いの数行の中にあることに起因する)表示IGNORE_THIS_LINE::のいずれかの発生をフィルタリングするようになっています。
2

使用方法プロセス置換は、中間入力ファイル記述子を作成する正しい方法です。しかし、tailはフォルダでは機能しません。ただ、フォルダ内のすべてのファイルを反復処理:

for f in folder1/*.txt; do 
    tail -n +2 $f | diff - <(tail -n +2 folder2/$(basename $f)) 
done 

注iは+2代わりの+1使用。 tail行番号はライン1から始まりません0

関連する問題