gnu diff 可以遞歸地僅比較不同資料夾結構中的檔案名稱嗎?

gnu diff 可以遞歸地僅比較不同資料夾結構中的檔案名稱嗎?

我知道我可以遞歸地比較兩個目錄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

這意味著對於每個文件,不會搜尋目錄層次結構,而是僅掃描單一文件。

相關內容