我如何处理符号链接后面的真实文件?

我如何处理符号链接后面的真实文件?

我有一个文件和一个符号链接:

file: ~/${USER_HOME}/blabla/.cheatsheet
symlink: ~/.cheatsheet (is linked to file above)

现在在我的脚本中我对文件执行一些操作,例如添加一行并按字母顺序对文件进行排序并移动它:

addOneCommand() {
  file"=~/.cheatsheet"
  # add it to the file
  echo "${cmd}" >> "${file}"
  # sort file instantly
  cat "${file}" | sort > "${file}".tmp
  mv "${file}".tmp "${file}"
}

但符号链接背后的实际文件不会受到脚本的影响(例如,不按字母顺序排序)。我该怎么做才能在 bash 脚本中使用“符号链接文件”?

谢谢。

答案1

重点是,你创建一个新文件${file}.tmp,现在不是符号链接,然后重命名。

你可以尝试

cat "${file}".tmp >"${file}"
rm "${file}".tmp

代替

mv "${file}".tmp "${file}"

如果你不介意竞争条件的话。

附言:如果我理解你的意图正确的话,你可能想要的sort -u不是简单的sort

答案2

您的问题是您正在使用mv,它将替换符号链接。

您可以使用许多其他方法(请参阅 Eugen Rieck 的答案),但从根本上讲,您需要重复使用符号链接,而不是代替它。

sponge是一个很好的工具,它还允许您删除文件的处理*.tmp

a使用来自 的符号链接文件b

$ echo -e "3\n1\n2" > a
$ ln -s a b
$ ls -l
total 1
-rw-r--r-- 1 attie attie 6 Mar  5 15:44 a
lrwxrwxrwx 1 attie attie 1 Mar  5 15:44 b -> a

a您可以通过进行排序和重写b,而不会影响符号链接:

$ cat b | sort | sponge b
$ ls -l
total 1
-rw-r--r-- 1 attie attie 6 Mar  5 15:44 a
lrwxrwxrwx 1 attie attie 1 Mar  5 15:44 b -> a
$ cat b
1
2
3

答案3

readlink您可以使用或命令找到符号链接后面的真实文件realpath

相关内容