Shell-Script
如何在兩個目錄中查找同名但行數不同的文件?
我有一個
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
如何獲取有差異的文件列表?
我用
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
任何幫助表示讚賞!
筆記:
- 我無法檢查日期,因為所有文件都已更新,無論是否更改。
- 有時最新的文件缺少一些行,因此我不能只取更大的文件。
這是一個帶有範例輸出的快速而骯髒的外殼“單線”:
$ 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
呼叫是在程序替換中完成的,工作目錄更改為sub1
或sub2
列印文件名時沒有目錄名。這樣join
可以找到常用文件。該
awk
命令比較第二列和第三列中的值,並且僅在值不同時列印該行。這將過濾掉具有相同行數的文件。
head -n-1
將列印所有行,但不列印最後一行。這將過濾掉最後total
一行wc
。