在 Unix 中删除链接的软链接

在 Unix 中删除链接的软链接

目前我想清理我的项目区域,但我面临的问题是 rm 中的一些副本仍保留在
链接的磁盘中,我指的是软链接

A linked to B 
 B linked to C

C 位于其他目录 A 和 B 位于同一文件夹中

知道我什么时候跑

rm -rf A 

它只删除了 A 和 B,但 C 仍留在磁盘上,我怎样才能从磁盘中删除 C..使用相同的命令..

答案1

你可以realpath这样使用:

rm $(realpath A)

设置示例:

$ cd $(mktemp -d)
$ pwd
/tmp/tmp.QwSuHKmWwE
$ touch C
$ ln -s C B
$ ln -s B A
$ stat -c "%N" *
`A' -> `B'
`B' -> `C'
`C'

显示出realpath你想要的东西:

$ realpath A
/tmp/tmp.QwSuHKmWwE/C

所以跑步rm $(realpath A)就像跑步rm C

$ rm $(realpath A)
$ stat -c "%N" *
`A' -> `B'
`B' -> `C'

或者您想删除所有三个文件?

在这种情况下,我认为你必须编写一个脚本。

这是可以完成这项工作的东西:

#!/bin/bash

if test $# -eq 0; then
    echo "Usage: dellinks.sh <file>..." 1>&2
    exit 2
fi

if ! type readlink >/dev/null 2>&1; then
    echo "dellinks.sh: cannot find readlink program" 1>&2
    exit 1
fi

for file in "$@"; do
    while test -L "$file"; do
        target="$(readlink "$file")"
        rm "$file"
        file="$target"
    done
    if test -e "$file"; then
        rm "$file"
    fi
done

例子:

$ stat -c "%N" *
`A' -> `B'
`B' -> `C'
`C'
$ ~/bin/dellinks.sh
Usage: dellinks.sh <file>...
$ ~/bin/dellinks.sh A
$ stat -c "%N" *
stat: cannot stat `*': No such file or directory

答案2

你可以试试

rm -fr `readlink B`

但是这将起作用,B因为它将删除它的目标C,但不能起作用,A因为它只会删除BA的目标)。

但这可以通过一个脚本轻松完成,该脚本将递归跟踪链接,直到得到非链接,然后将其传递给rm -fr

相关内容