Diff
使用 diff -r 遞歸比較兩個目錄,而在斷開的連結上沒有輸出
我
diff -r a b
用來遞歸地比較目錄a和b。儘管存在一些斷開的連結(a和b目錄中的相同斷開連結並指向相同的、不存在的目標),但這種情況經常發生。diff然後為這些情況輸出錯誤消息並以非零退出程式碼退出,但是我希望它保持沉默,並以 0 退出,因為我書中的目錄是相同的。
我怎樣才能做到這一點?
對於 3.3 或更高版本
diff
,您應該使用該--no-dereference
選項,如Pete Harlan 的回答中所述。不幸的是,舊版本
diff
不支持忽略符號連結:有些文件既不是目錄也不是正常文件:它們是不尋常的文件,如符號連結、設備特殊文件、命名管道和套接字。目前,
diff
將符號連結視為正常文件;如果在頂層指定了其他特殊文件,則它將其他特殊文件視為正常文件,但在比較目錄時僅報告它們的存在。這意味著patch
不能表示對此類文件的更改。例如,如果您更改符號連結指向的文件,diff
則輸出兩個文件之間的差異,而不是對符號連結的更改。
diff
應該選擇性地報告對特殊文件的更改,並且patch
應該擴展以理解這些擴展。如果您只想驗證 rsync(並可能修復失去的內容),那麼您可以再次執行 rsync 命令。如果您不想這樣做,那麼對目錄進行校驗和可能就足夠了。
如果您真的想使用 執行此操作
diff
,則可以使用find
跳過符號連結,並分別在每個文件上執行 diff。將您的目錄a和b作為參數傳遞:#!/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
對於您的方案,這可能不是問題。