在 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