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.
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=1if[ a$1 =="a-R"];then recursive=" -R ";fifor i in $(ls -i $recursive | awk '{print $1}'| uniq --repeated | sort);do
echo "Inode with multiple hardlinked files: $i"
first=1for foundfile in $(find .-xdev -inum $i);doif[ $first ==1];then
echo " preserving the first file: $foundfile"
first=0else
echo " deleting the redundant file: $foundfile"#rm $foundfile fidoneif[ $ask ==1];then
read -p "Delete all the rest of redundant hardlinks without asking? y/N "if[ a${REPLY,,}=="ay"];then ask=0;fifi# read -p "pause for sure"
echo
done
echo "All redundant hardlins are removed."
echo
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).
ln -n /path/to/file
tworzy plik o nazwiefile
w bieżącym katalogu i jest skrótem odln --no-dereference /path/to/file
. Oznacza to, że jeśli/path/to/file
jest dowiązaniem symbolicznym, nowo utworzone dowiązanie twarde wskaże to dowiązanie symboliczne zamiast celu dowiązania symbolicznego.Odpowiedzi:
Można usunąć je z
rm
jak 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.źródło
sudo
), jeśli utworzyłeś go za pomocą podanego polecenia (jako superużytkownik).Mam ten skrypt, aby usunąć zbędne twarde linki. Ale uważaj - to dość niebezpieczne.
źródło
W rzeczywistości
rm
nie działa:Co działa to
unlink AZP
.źródło
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).AZP
jest dowiązaniem symbolicznym do katalogu (lub czegokolwiek innego)rm AZP/
nie będzie działać, ponieważrm
uważa, że jest to katalog (z powodu/
końca). Jednakrm AZP
będzie działać dobrze. -1Jeśli chcesz usunąć tylko link, a tym samym zachować oryginalny plik, musisz użyć unlink.
źródło
unlink(1)
robi? To płytkie opakowanie wokółunlink(2)
wywołania systemowego, to samo wywołanie systemowe, którerm(1)
stosuje się do wszystkich plików, które nie są katalogami.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).