1

в настоящее время я хочу очистить мою область proj, но проблема с rm, с которой я сталкиваюсь, состоит в том, что некоторая копия остается на диске
со ссылкой я имею в виду мягкую ссылку

A linked to B 
 B linked to C

C, который находится в другом каталоге A & B, находится в той же папке

знаю, когда я бегу

rm -rf A 

он удаляет только A & B, но C остается на диске, как я могу удалить C с диска .. с помощью той же команды ..

2 ответа2

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
0

Ты можешь попробовать

rm -fr `readlink B`

но это будет работать с B так как он удалит свою цель C , но не с A потому что тогда он будет удалять только B (цель A ).

но это можно легко сделать с помощью скрипта, который будет рекурсивно следовать ссылкам, пока не получит ссылку, а затем передать ее в rm -fr

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .