我知道我可以遞歸地比較兩個目錄diff -qr
並僅輸出差異。但是,這似乎是比較樹中的文件位置(例如,/a/b/file01 != /b/c/file01
)。
我想比較兩個不同的樹並僅產生唯一的檔案(無論它們在樹中的位置如何)。所以在上面的例子中,file01
將被視為匹配。這是否可以使用diff
,或者我必須執行嵌套find
循環並迭代每個循環?
答案1
我會用find
一些惡作劇:
假設這兩條路徑是 /a 和 /b:
find /a/ /b/ -exec basename \{} \; | sort | uniq -u
所以這就是「尋找 /a 和 /b 中的所有文件,並輸出它們的基名(即刪除的路徑),然後對它們進行排序,然後輸出清單中的任何唯一值」。
如果您想找到這些文件在目錄中的位置,我們可以將整個事情包裝在一個循環中並找到它們:
for i in `find /a/ /b/ -exec basename \{} \; | sort | uniq -u`; do find /a/ /b/ -name $i; done
答案2
我認為這是不可能的diff
。我認為您正在考慮以下內容:
find tree1 -type f | while f=`line` ; do diff $f `find tree2 -type f -name "${f##*/}"`; done
(這需要詳細說明,以允許來自tree2
的每個文件有多個實例或沒有實例tree1
,以及嵌入的空白。)
為了加快速度,您可以先將文件清單儲存在tree2
:
find tree2 -type f >tree2.list
find tree1 -type f | while f=`line` ; do diff $f `grep <tree2.list "/${f##*/}$"`; done
這意味著對於每個文件,不會搜尋目錄層次結構,而是僅掃描單一文件。