Jak usunąć twardy link?


23

Ostatnio utworzyłem link z następującymi elementami:

sudo ln -n originalFileLocation

Jak usunąć twardy link?


4
FYI: ln -n /path/to/filetworzy plik o nazwie filew bieżącym katalogu i jest skrótem od ln --no-dereference /path/to/file. Oznacza to, że jeśli /path/to/filejest dowiązaniem symbolicznym, nowo utworzone dowiązanie twarde wskaże to dowiązanie symboliczne zamiast celu dowiązania symbolicznego.
Lekensteyn,

Odpowiedzi:


37

Można usunąć je z rmjak zwykle: rm NameOfFile. Zauważ, że w przypadku twardych linków nie ma rozróżnienia między „oryginalnym plikiem” a „linkiem do pliku”: masz tylko dwie nazwy tego samego pliku, a usunięcie tylko jednej z nich nie spowoduje usunięcia drugiej.


2
Pamiętaj też, że musisz to zrobić jako root (use sudo), jeśli utworzyłeś go za pomocą podanego polecenia (jako superużytkownik).
Rafał Cieślak

3
@ RafałCieślak: Źle. Wszystkie dowiązania twarde do i-węzła mają takie same uprawnienia dostępu, jak dla i-węzła. Aby usunąć, tzn. „Odłączyć” pozycję katalogu pliku, musisz mieć uprawnienia do zapisu w i-węźle tego pliku oraz w katalogu, który zawiera pozycję, którą chcesz usunąć. Dlatego nie ma znaczenia, jakie uprawnienia zostały użyte do utworzenia twardego łącza. Mogą się zdarzyć (nadal) takie same jak w momencie stworzenia.
David Foerster

2

Mam ten skrypt, aby usunąć zbędne twarde linki. Ale uważaj - to dość niebezpieczne.

#!/bin/bash
clear
echo Reduce redundant hardlinks in the current folder
echo ------------------------------------------------
echo 
echo "  $(basename $0) [-R]"
echo "      -R means recursive"
echo 
read -p "You can break by pressing Ctrl+C"
echo
ask=1
if [ a$1 == "a-R" ]; then  recursive=" -R "; fi

for i in $(ls -i $recursive | awk '{print $1}' | uniq --repeated | sort); 
do 
    echo "Inode with multiple hardlinked files: $i"
    first=1
    for foundfile in $(find . -xdev -inum $i);
    do 
        if [ $first == 1 ]; then
            echo "  preserving the first file:  $foundfile"
            first=0
        else
            echo "  deleting the redundant file:    $foundfile"  
            #rm $foundfile  
        fi
    done 
    if [ $ask == 1 ]; then 
        read -p "Delete all the rest of redundant hardlinks without asking? y/N "
        if [ a${REPLY,,} == "ay" ]; then  ask=0; fi
    fi  
#   read -p "pause for sure"
    echo
done
echo "All redundant hardlins are removed."
echo

1

W rzeczywistości rmnie działa:

[user@localhost Products]$ rm AZP/
rm: cannot remove `AZP/': Is a directory
[user@localhost Products]$ rm -r AZP/
rm: cannot remove `AZP': Not a directory

Co działa to unlink AZP.


2
Jesteś pewien, że Twój link był twardy? Twarde linki są jak pliki iirc.
Seth

@Seth, właściwie nie pamiętam, co to było, ale nie chce tego usuwać, jak widać. Ktoś kazał mi użyć unlink i to zadziałało. :)
Bunyk

Prawdopodobnie dlatego, że AZP był plikiem, a nie katalogiem, ale nie mogłem być pewien bez dodatkowych informacji. Odłączanie zawsze powinno jednak działać, więc nie ma żadnych problemów.
Seth

1
AZP/wygląda jak katalog, rm nie działa na katalogach bez flagi rekurencyjnej. Również zgodnie z dokumentami Coreutills. >>> Większość systemów zabrania tworzenia twardego linku do katalogu; na tych, gdzie jest to dozwolone, tylko superużytkownik może to zrobić (i ostrożnie, ponieważ tworzenie cyklu spowoduje problemy dla wielu innych narzędzi).
ThorSummoner

2
Twarde linki do katalogów są zabronione. If AZPjest dowiązaniem symbolicznym do katalogu (lub czegokolwiek innego) rm AZP/nie będzie działać, ponieważ rmuważa, że ​​jest to katalog (z powodu /końca). Jednak rm AZPbędzie działać dobrze. -1
David Foerster

0

Jeśli chcesz usunąć tylko link, a tym samym zachować oryginalny plik, musisz użyć unlink.


Czy przeczytałeś co unlink(1)robi? To płytkie opakowanie wokół unlink(2)wywołania systemowego, to samo wywołanie systemowe, które rm(1)stosuje się do wszystkich plików, które nie są katalogami.
David Foerster

1
Ta odpowiedź jest myląca. W przypadku plików dowiązanych na stałe nie ma rozróżnienia między „linkiem” a „plikiem oryginalnym”; wszystkie dowiązania twarde odnoszą się do tego samego pliku / treści / i-węzła, reprezentowanych przez różne pozycje katalogu. unlink, pomimo swojej nazwy, nie rozdzieli twardego linku na dwa osobne pliki, ale usunie pozycję katalogu „niepowiązanego” (ale nie plik / zawartość / i-węzeł, o ile liczba linków wynosi> 1).
Murphy
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.