Filesystems
如何將符號連結(視為文本文件)更改為該文本文件的內容(即“刪除符號連結位”)?
在 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