如何防止sed破坏hardinks?

use*_*430 5 sed hard-link

我的问题类似于如何防止 sed -i 破坏符号链接?,但关于硬链接。

使用sed -i对文件的工作写入到一个临时文件,然后移动这会破坏所有的文件有硬链接,因为sed的作品。该--follow-symlinks参数在硬链接的情况下没有帮助。

是否有使用相当丑陋的替代方法:

sed 's/cat/dog/' pet_link > pet_link
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 12

对于sed 's/cat/dog/'或任何其他不会改变文件大小的替换,使用任何类似 Bourne 的 shell,您可以执行以下操作:

sed 's/cat/dog/' < file 1<> file
Run Code Online (Sandbox Code Playgroud)

鲜为人知但已超过 35 岁¹ 的标准 <>运算符是以读+写模式打开文件而不会被截断。基本上,这使得sed将其输出写入其输入。确保输出不会覆盖sed尚未读取的文件部分非常重要。

对于导致文件大小减小的替换,使用ksh93

sed 's/hippopotamus/ant/' < file 1<>; file
Run Code Online (Sandbox Code Playgroud)

<>;,ksh93扩展名与其他相同,<>只是如果被重定向的命令成功,则文件在命令完成的地方被截断。

或者使用 perl:

perl -pe 's/hippopotamus/ant/;
          END{truncate STDOUT, tell STDOUT}' < file 1<> file
Run Code Online (Sandbox Code Playgroud)

对于其他任何事情,只需使用标准形式:

cp -i file file.back &&
  sed 's/dog/horse/g' < file.back > file # && rm -f file.back
Run Code Online (Sandbox Code Playgroud)

¹ 尽管 Bourne shell 和 Korn shell 的早期版本中的初始实现实际上已被破坏,但在 80 年代后期已修复。而 Almquist shell 最初并不支持它。