Bagaimana cara saya menghapus tautan keras?

23

Baru-baru ini saya membuat tautan dengan yang berikut:

sudo ln -n originalFileLocation

Bagaimana cara saya menghapus tautan keras?

Hawkeye
sumber
4
FYI: ln -n /path/to/filemembuat file bernama filedi direktori saat ini dan singkatan untuk ln --no-dereference /path/to/file. Ini berarti bahwa jika /path/to/fileini adalah tautan simbolik, hardlink yang baru dibuat akan menunjuk ke symlink itu dan bukan target symlink.
Lekensteyn

Jawaban:

37

Anda dapat menghapusnya dengan rmseperti biasa: rm NameOfFile. Perhatikan bahwa dengan tautan keras tidak ada perbedaan antara "file asli" dan "tautan ke file": Anda hanya memiliki dua nama untuk file yang sama, dan menghapus hanya satu nama tidak akan menghapus yang lain.

Prateek
sumber
2
Juga ote Anda perlu rm sebagai root (gunakan sudo), jika Anda membuatnya dengan perintah yang Anda berikan (sebagai super-user).
Rafał Cieślak
3
@ RafałCieślak: Salah. Semua tautan keras ke inode berbagi izin akses yang sama, yaitu inode. Untuk menghapus, yaitu "batalkan tautan", entri direktori dari file yang Anda butuhkan izin tulis pada inode file itu dan pada direktori yang berisi entri yang ingin Anda hapus. Oleh karena itu tidak relevan hak istimewa apa yang digunakan untuk membuat tautan keras. Mereka mungkin kebetulan (masih) sama dengan pada saat penciptaan.
David Foerster
2

Saya memiliki skrip ini untuk menghapus tautan keras yang berlebihan. Tapi hati-hati - ini cukup berbahaya.

#!/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
xerostomus
sumber
1

Sebenarnya rmtidak berfungsi:

[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

Apa yang berhasil unlink AZP.

Bunyk
sumber
2
Apakah Anda yakin tautan Anda keras? Hard link sama seperti file iirc.
Seth
@Seth, sebenarnya saya tidak ingat apa itu, tetapi tidak ingin menghapus seperti yang Anda lihat. Seseorang mengatakan kepada saya untuk menggunakan pembatalan tautan dan itu berhasil. :)
Bunyk
Itu mungkin karena AZP adalah file, bukan direktori, tetapi saya tidak bisa memastikan tanpa informasi lebih lanjut. Putuskan tautan harus selalu berfungsi, jadi tidak ada masalah di sana.
Seth
1
AZP/terlihat seperti direktori, rm tidak beroperasi pada direktori tanpa tanda rekursif. Juga menurut dokumentasi coreutills. >>> Sebagian besar sistem melarang membuat tautan keras ke direktori; pada yang diizinkan, hanya pengguna super yang dapat melakukannya (dan dengan hati-hati, karena membuat siklus akan menyebabkan masalah bagi banyak utilitas lain).
ThorSummoner
2
Tautan keras ke direktori dilarang. Jika AZPtautan simbolis ke direktori (atau apa pun) rm AZP/tidak akan berfungsi karena rmmenganggap itu direktori (karena /pada akhirnya). Namun rm AZPakan bekerja dengan baik. -1
David Foerster
0

Jika Anda hanya ingin menghapus tautan dan menyimpan file aslinya, Anda harus menggunakan pembatalan tautan.

fbo72
sumber
Sudahkah Anda membaca apa unlink(1)? Ini adalah pembungkus dangkal di sekitar unlink(2)panggilan sistem, panggilan sistem yang sama yang rm(1)digunakan untuk semua file yang bukan direktori.
David Foerster
1
Jawaban ini menyesatkan. Dengan file yang di-link, tidak ada perbedaan antara "tautan" dan "file asli"; semua hardlink merujuk ke file / konten / inode yang sama, diwakili oleh entri direktori yang berbeda. unlink, terlepas dari namanya, tidak akan memisahkan hardlink menjadi dua file terpisah, tetapi menghapus entri direktori "tidak terhubung" (tetapi bukan file / konten / inode, selama jumlah tautannya> 1).
Murphy