Diff

使用 diff -r 遞歸比較兩個目錄,而在斷開的連結上沒有輸出

  • February 13, 2017

diff -r a b用來遞歸地比較目錄ab。儘管存在一些斷開的連結(ab目錄中的相同斷開連結並指向相同的、不存在的目標),但這種情況經常發生。

diff然後為這些情況輸出錯誤消息並以非零退出程式碼退出,但是我希望它保持沉默,並以 0 退出,因為我書中的目錄是相同的。

我怎樣才能做到這一點?

對於 3.3 或更高版本diff,您應該使用該--no-dereference選項,如Pete Harlan 的回答中所述。

不幸的是,舊版本diff 不支持忽略符號連結

有些文件既不是目錄也不是正常文件:它們是不尋常的文件,如符號連結、設備特殊文件、命名管道和套接字。目前,diff將符號連結視為正常文件;如果在頂層指定了其他特殊文件,則它將其他特殊文件視為正常文件,但在比較目錄時僅報告它們的存在。這意味著patch不能表示對此類文件的更改。例如,如果您更改符號連結指向的文件,diff則輸出兩個文件之間的差異,而不是對符號連結的更改。

diff應該選擇性地報告對特殊文件的更改,並且patch應該擴展以理解這些擴展。

如果您只想驗證 rsync(並可能修復失去的內容),那麼您可以再次執行 rsync 命令。如果您不想這樣做,那麼對目錄進行校驗和可能就足夠了。

如果您真的想使用 執行此操作diff,則可以使用find跳過符號連結,並分別在每個文件上執行 diff。將您的目錄ab作為參數傳遞:

#!/bin/bash
# Skip files in $1 which are symlinks
for f in `find $1/* ! -type l`
do
   # Suppress details of differences
   diff -rq $f $2/${f##*/}
done

或作為單行:

for f in `find a/* ! -type l`;do diff -rq $f b/${f##*/};done

這將辨識內容不同的文件,或在a中但不在b中的文件。

注意:

  • 因為我們完全跳過了符號連結,所以如果符號連結名稱不存在於b中,這不會注意到。如果您需要,您將需要第二次查找傳遞來辨識所有符號連結,然後顯式檢查它們在b中的存在。
  • b中的額外文件不會被辨識,因為列表是根據 a 的內容構造rsync對於您的方案,這可能不是問題。

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