如何让rm不删除符号链接?

23 浏览
0 Comments

如何让rm不删除符号链接?

所以,我正在清理不需要的文件,删除了一些文件夹。过了一段时间,我看到另一个在ls -la中显示为红色的文件夹。我知道我删除了实际的文件夹,因此非常难过,试图运行foremost进行恢复,但运气不佳。有人可以给我一些好的别名/函数,像rm -rf一样删除,但如果该文件与其他文件链接,则它不会被删除。比如,如果/usr/bin/a.py链接到/root/a.py,我运行rm -rf /usr/bin/a.py,那么/root/a.py会被删除。如何通过别名来避免这种情况?

admin 更改状态以发布 2023年5月22日
0
0 Comments

我不认为它的行为是你所描述的那样。rm不会跟随符号链接。

你唯一能够删除某些东西的方法就是像这样做:rm -rf myFolder/*,其中myFolder是链接的目录。

0
0 Comments

Joe W的回答正确地说rm通常不会删除符号链接的目标,但是说它“不遵循符号链接”不太准确,至少在我的系统上(GNU coreutils 8.25)是这样。而删除文件是一个很重要的事情!让我们看看它在几种情况下的行为。

如果您的符号链接是指向文件而不是目录,则没有合理的方式可以意外删除目标,使用rm。您必须要做一些非常明确的事情,比如rm" $(readlink file)"

然而,指向目录的符号链接有点棘手,就像您意外删除一个符号链接时一样。这里是我们可以使用的测试案例:

$ mkdir test1
$ touch test1/foo.txt
$ ln -s test1 test2
$ ls -lR
.:
total 4
drwxrwxr-x 2 soren soren 4096 Jun 29 17:02 test1
lrwxrwxrwx 1 soren soren    5 Jun 29 17:02 test2 -> test1
./test1:
total 0
-rw-rw-r-- 1 soren soren 0 Jun 29 17:02 foo.txt

这些都是安全的:

  • rm test2(仅删除符号链接)
  • rm -r test2(仅删除符号链接)
  • rm -rf test2(仅删除符号链接)
  • rm test2 / rm:无法删除“test2 /”:是目录 - 没有执行任何操作)
  • rm -rf * 2 (或任何其他与符号链接匹配的glob - 仅删除符号链接)

这些不安全:

  • rm -r test2 / rm:无法删除“test2 /”:不是目录 - 但删除test1目录的内容)
  • rm -rf test2 / (删除目录的内容,保留符号链接,没有错误)
  • rm -rf test2 / * (删除目录的内容,保留符号链接,没有错误)

最后一个不安全的情况可能是显而易见的行为,至少对于熟悉 shell 的人来说是这样,但前面两个情况相对更加微妙和危险,尤其是因为 Tab 键会为您添加test2 的尾随斜杠!

有趣的是,test具有类似的行为,认为以尾随斜杠的符号链接目录不是符号链接而是目录,而没有尾随斜杠的符号链接则是符号链接和目录:

$ [ -L "test2" ] && echo "is link"
is link
$ [ -d "test2" ] && echo "is directory"
is directory
$ [ -L "test2/" ] && echo "is link"
$ [ -d "test2/" ] && echo "is directory"
is directory

这里是之前的处理,“删除不删除目标的符号链接到目录”,分析没有这样彻底,但提供了其他有用信息。


不幸的是,我不知道任何方法可以将rm别名来防止这个错误。我想您可以编写一个函数来解析rm的参数,并警告您其中任何一个是以尾随斜杠结尾的符号链接,如下所示:

function rm {
    for i in "$@"; do
        if [[ $i =~ /$ ]] && [ -L "${i:0:-1}" ]; then
            read -rp "Really delete symlink '$i' with trailing slash (y/n)? " result
            [ "$result" != "y" ] && return
        fi
    done
    command rm "$@"
}

使用时请自行决定!它通过shellcheck,并在我测试时工作,但在极其重要和危险的rm之上实现一个包装器让我很不安。

在您的别名/函数中可以包含的另外两个有用的开关是--one-file-system(至少跳过符号链接或挂载到另一个驱动器的文件)和-i-I ,以在执行潜在危险的操作时提示。

0