Làm cách nào để xóa một liên kết cứng?


23

Gần đây tôi đã tạo một liên kết với các mục sau:

sudo ln -n originalFileLocation

Làm cách nào để xóa một liên kết cứng?


4
FYI: ln -n /path/to/filetạo một tệp có tên filetrong thư mục hiện tại và viết tắt cho ln --no-dereference /path/to/file. Điều này có nghĩa là nếu /path/to/filelà một liên kết tượng trưng, ​​liên kết cứng mới được tạo sẽ trỏ đến liên kết tượng trưng đó thay vì mục tiêu của liên kết tượng trưng.
Lekensteyn

Câu trả lời:


37

Bạn có thể xóa nó rmnhư bình thường : rm NameOfFile. Lưu ý rằng với các liên kết cứng, không có sự phân biệt giữa "tệp gốc" và "liên kết đến tệp": bạn chỉ có hai tên cho cùng một tệp và xóa chỉ một tên sẽ không xóa tên kia.


2
Ngoài ra, bạn sẽ cần phải rm nó dưới dạng root (sử dụng sudo), nếu bạn đã tạo nó bằng lệnh bạn đã cung cấp (với tư cách là siêu người dùng).
Rafał Cieślak

3
@ RafałCieślak: Sai. Tất cả các liên kết cứng đến một nút đều có chung quyền truy cập, đó là của các nút. Để xóa, tức là, unlink unlink, một mục nhập thư mục của một tệp bạn cần có quyền ghi trên nút của tệp đó và trên thư mục chứa mục mà bạn muốn xóa. Do đó, không có liên quan nào được sử dụng để tạo liên kết cứng. Chúng có thể chỉ xảy ra (vẫn) giống như tại thời điểm tạo ra.
David Foerster

2

Tôi có kịch bản này để loại bỏ các liên kết cứng dư thừa. Nhưng hãy cẩn thận - nó khá nguy hiểm.

#!/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

Trên thực tế rmkhông hoạt động:

[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

Những gì làm việc là unlink AZP.


2
Bạn có chắc chắn đó là một liên kết cứng? Liên kết cứng giống như tập tin iirc.
Seth

@ Vì vậy, thực sự tôi không nhớ đó là gì, nhưng nó không muốn xóa như bạn có thể thấy. Ai đó bảo tôi sử dụng unlink và nó đã hoạt động. :)
Bunyk

Điều đó có thể là do AZP là một tập tin, không phải là một thư mục, nhưng tôi không thể chắc chắn nếu không có thêm thông tin. Bỏ liên kết nên luôn luôn hoạt động, vì vậy không có vấn đề ở đó.
Seth

1
AZP/trông giống như một thư mục, rm không hoạt động trên các thư mục mà không có cờ đệ quy. Cũng theo các tài liệu coreutills. >>> Hầu hết các hệ thống đều cấm tạo liên kết cứng đến thư mục; trên những nơi được phép, chỉ có siêu người dùng mới có thể làm như vậy (và thận trọng, vì việc tạo chu trình sẽ gây ra sự cố cho nhiều tiện ích khác).
ThorSummoner

2
Liên kết cứng đến thư mục bị cấm. Nếu AZPlà một liên kết tượng trưng đến một thư mục (hoặc bất cứ điều gì khác) rm AZP/sẽ không hoạt động vì rmnghĩ rằng đó là một thư mục (vì /ở cuối). Tuy nhiên rm AZPsẽ hoạt động tốt. -1
David Foerster

0

Nếu bạn muốn xóa chỉ liên kết và do đó giữ tệp gốc, bạn phải sử dụng hủy liên kết.


Bạn đã đọc những gì unlink(1)không? Đó là một trình bao bọc nông xung quanh lệnh unlink(2)gọi hệ thống, cùng một lệnh gọi hệ thống rm(1)sử dụng cho tất cả các tệp không phải là thư mục.
David Foerster

1
Câu trả lời này là sai lệch. Với các tệp liên kết cứng, không có sự phân biệt giữa "liên kết" và "tệp gốc"; tất cả các liên kết cứng đề cập đến cùng một tệp / nội dung / inode, được thể hiện bằng các mục thư mục khác nhau. unlink, mặc dù tên của nó, sẽ không tách một liên kết cứng thành hai tệp riêng biệt, nhưng xóa mục nhập thư mục "không liên kết" (nhưng không phải tệp / nội dung / inode, miễn là số lượng liên kết là> 1).
Murphy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.