sub1
次のファイルを含むディレクトリがあります。
$ wc -l *
5 file1.csv
5 file3.csv
1 file4.csv
にはsub2
次のものがあります。
$ wc -l *
5 file1.csv
5 file2.csv
1 file3.csv
5 file4.csv
1 file5.csv
最初のディレクトリには行が追加されたファイルがある可能性があり、そのファイルは2番目のディレクトリに移動します。この例ではfile3
。sub2
違いのあるファイルのリストを取得するには?
diff
私はandでいくつかのテストをしましたが、grep
ディレクトリに別のファイルがあるので動作しません(したがって行が異なります)。
~/dir1/$ wc -l >> wc.luis
~/dir1/$ wc -l * | awk '{ gsub(/\/home.*dir1\//,""); print $0 }'
| diff --side-by-side wc.luis -
| grep \|
理想的には、次のリストを取得します。
5 file3.csv | 1 file3.csv
1 file4.csv | 5 file4.csv
助けてくれてありがとう!
メモ:
変更に関係なく、すべてのファイルが更新されたため、日付を確認できません。
時には最新のファイル部族いくつかの線があるので、大きな線では到達できません。
ベストアンサー1
以下は、出力例を含む高速で汚れたシェル「1行」です。
$ join -j2 <(cd sub1; wc -l *) <(cd sub2; wc -l *) | awk '$2!=$3'
file3.csv 5 1
file4.csv 1 5
total 11 17
このtotal
行はの出力結果ですwc
。他のフィルタを使用して削除できます。
$ join -j2 <(cd sub1; wc -l *) <(cd sub2; wc -l *) | awk '$2!=$3' | head -n-1
file3.csv 5 1
file4.csv 1 5
説明する:
join
共通列に基づいて2つのファイルが結合されます。この例では、-j2
2番目の列()に基づいて結合します。wc
出力の2番目の列はファイル名です。これにより、両方のディレクトリに共通のファイルのみが印刷されます。
電話時間wc
は次のとおりです。プロセスの交換作業ディレクトリがsub1
左右に変わるため、ディレクトリsub2
名なしでファイル名が印刷されます。この方法でjoin
共通ファイルを見つけることができます。
このawk
コマンドは、2番目の列と3番目の列の値を比較し、値が異なる場合にのみ行を印刷します。これにより、同じ行数のファイルがフィルタリングされます。
head -n-1
すべての行を印刷しますが、最後の行は印刷しません。total
これにより、最後の行がフィルタリングされますwc
。