我有一個腳本可以在我的主目錄中遞歸地創建到我的設定目錄的符號鏈接,以將文件置於版本控制之下。我希望它跳過已經透過父目錄符號連結的檔案。也就是說,如果我有這些文件/目錄:
~/foo/ -> ~/settings/foo/
~/settings/foo/
~/settings/foo/bar
,如何檢查 ~/foo/bar 和 ~/settings/foo/bar 是否是同一個檔案?
編輯:哦,又搜尋了幾分鐘發現了回答:readlink -f $path
答案1
如果兩個檔案具有相同的 deviceID 和 inode,則它們是同一個檔案。命令stat
列工具使查找變得容易,並且該解決方案與 POSIX shell 相容。
if [ "$(stat -L -c %d:%i FILE1)" = "$(stat -L -c %d:%i FILE2)" ]; then
echo "FILE1 and FILE2 refer to a single file, with one inode, on one device."
else
echo "no match"
fi
-L
每個中的標誌意味著stat
這適用於符號連結和硬連結檔案。
答案2
許多 shell 都有一個內建-ef
運算子test
(或其同義詞[
)來測試兩個路徑是否指向相同的現有文件(遵循符號連結)。這包括 bash、dash、pdksh、ksh88、ksh93 和 zsh,但不包括 POSIX sh。在 bash、ksh 或 zsh 中,您也可以在條件構造-ef
中使用[[ … ]]
。
if ! [ "$1" -ef "$2" ]; then # $1 and $2 are different files
答案3
對於軟連結(使用 建立ln -s
),您可以使用realpath
。但這不適用於硬連結。