Filesystems

如何將符號連結(視為文本文件)更改為該文本文件的內容(即“刪除符號連結位”)?

  • August 20, 2021

在 ubuntu Linux 中,我有一堆嚴重損壞的符號連結,例如:

$ ls -l setup.conf
lrwxrwxrwx 1 ont ont 27 Aug 19 15:26 setup.conf -> '# Source it'$'\r''. ../setup.conf'

它們是嘗試將項目中的所有符號連結替換. ../setup.conf為目標文件的註釋和源呼叫 (" “) 的結果。它們都是# Source it\n. .../setup.conf帶有符號連結位的真正文本文件(範例包含:“”)。這是使用 git 和 windows 完成的。

一個理論上的解決方法是只刪除“符號連結位”並保持生成的文本文件不變,但我認為沒有辦法這樣做(chmod其他工具將其視為“懸空符號連結”並拒絕對文本文件進行操作本身)。

另一個解決方法是手動創建一個新文件,其內容與上述ls命令相同。我寧願不這樣做,因為它很乏味且容易出錯,而且文件也不相同)。

編輯:添加:我想得到一個名為 setup.conf 的正常文件,其內容是“ # Source it<newline>. ../setup.conf'

我不完全確定您是要修復符號連結還是用文本文件替換它們。此解決方案將符號連結替換為文本文件:

find -type l -exec bash -c '
   for f in "$@"
   do
       t=$(readlink "$f")
       rm -f "$f"
       printf "%s\n" "$t" >"$f"
   done
' _ {} +

您可以通過刪除rm並修改printf要寫入的"$f.tmp.txt"而不是"$f". (請記住.tmp.txt之後刪除文本文件。)

如果您希望\r替換\n為更易於閱讀,您也可以這樣做:

printf "%s\n" "${t//'$'\r/\n''}" >"$f"     # non-POSIX
printf "%s\n" "$t" | tr "\r" "\n" >"$f"    # POSIX

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