兩個目錄差多少?


如果有兩個目錄 abc 與 xyz 底下的子目錄, 孫目錄結構大約相同, 只有少數幾個檔案不太一樣, 要如何找出相異的部分?

以下分號分開的指令請個別打 這裡寫在一起只是因為講義的作者偷懶...

取得一個壓縮檔 pqr.tgz 檢視它的內容: tar tvzf pqr.tgz 假設所有檔案都在 pqr/ 子目錄底下。 我們將同樣的東西分別重複放到兩個目錄 abc 與 xyz 底下: tar xzf pqr.tgz ; mv pqr abc ; tar xzf pqr.tgz ; mv pqr xyz 然後進去 xyz 子目錄裡面看一下有那些子目錄, 孫目錄, ...: cd xyz ; du 當然也可以下 find . -type d 不過 du 比較簡單, 又可以順便看出那個子目錄裡面東西比較多。 隨便亂改一氣:

  1. 在某個深層子目錄裡面新增一個檔案 (用 touch 指令最簡單; cp 也可以; 不要忘記還可以 I/O redirection ... 不見得一定要開 editor)
  2. 在某個深層子目錄裡面刪除一個檔案
  3. 在某個深層子目錄裡面修改某個檔案的內容

好了, 如果現在 abc 與 xyz 這兩個目錄是別人給你的, 你如何發現它們那裡不同呢?

	cd ~/abc
	find . -type f | sort > ~/abc.find
	md5sum `cat ~/abc.find` > ~/abc.md5

如法炮製, 產生 ~/xyz.md5, 然後 diff abc.md5 xyz.md5comm -3 abc.md5 xyz.md5 請仔細觀察 diff 的輸出, "<" 符號標示的資料, 來自那個檔案? ">" 呢? 又請查手冊, 看看 comm 後面的 -3 這個 option 是什麼意思。 如果是 -1 或 -2 或這三者的不同組合, 會有什麼效果?

當你已處理完 abc/, 還沒有處理 xyz/ 時, 也可以一口氣這樣下:

	cd ~/xyz
	md5sum `find . -type f | sort` | diff ~/abc.md5 -

這裡的 "-" 表示餵給 diff 的第二個參數是 Standard Input, 所以可以從 pipe 餵給 diff 吃。 很多指令都接受這樣的寫法。 例如要檢查一個檔案 abc.txt 是否已然排序, 可以這樣下: sort abc.txt | diff abc.txt -