如何将符号链接(视为文本文件)更改为该文本文件的内容(即“删除符号链接位”)?

如何将符号链接(视为文本文件)更改为该文本文件的内容(即“删除符号链接位”)?

在 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'

答案1

我不完全确定您是否要修复符号链接或将其替换为文本文件。此解决方案用文本文件替换符号链接:

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

相关内容