Shell-Script

如何在兩個目錄中查找同名但行數不同的文件?

  • September 6, 2016

我有一個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

在第一個目錄中,我可能有添加行的文件,然後轉到第二個目錄。在這個例子中,我可能需要更新file3.sub2

如何獲取有差異的文件列表?


我用diffand做了一些測試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

任何幫助表示讚賞!


筆記:

  • 我無法檢查日期,因為所有文件都已更新,無論是否更改。
  • 有時最新的文件缺少一些行,因此我不能只取更大的文件。

這是一個帶有範例輸出的快速而骯髒的外殼“單線”:

$ 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將基於一個公共列連接兩個文件。在這種情況下,我們基於第二列 ( -j2) 加入。wc第二列的輸出是文件名。這只會列印兩個目錄中通用的文件。

wc呼叫是在程序替換中完成的,工作目錄更改為sub1sub2列印文件名時沒有目錄名。這樣join可以找到常用文件。

awk命令比較第二列和第三列中的值,並且僅在值不同時列印該行。這將過濾掉具有相同行數的文件。

head -n-1將列印所有行,但不列印最後一行。這將過濾掉最後total一行wc

引用自:https://unix.stackexchange.com/questions/308005