ฉันจะลบฮาร์ดลิงก์ได้อย่างไร


23

เมื่อเร็ว ๆ นี้ฉันสร้างลิงค์ด้วยสิ่งต่อไปนี้:

sudo ln -n originalFileLocation

ฉันจะลบฮาร์ดลิงก์ได้อย่างไร


4
FYI: ln -n /path/to/fileสร้างไฟล์ชื่อในไดเรกทอรีปัจจุบันและเป็นชวเลขfile ln --no-dereference /path/to/fileซึ่งหมายความว่าหาก/path/to/fileเป็นลิงก์สัญลักษณ์ฮาร์ดลิงก์ที่สร้างขึ้นใหม่จะชี้ไปที่ symlink นั้นแทนที่จะเป็นเป้าหมายของ symlink
Lekensteyn

คำตอบ:


37

คุณสามารถลบมันด้วยตามปกติ:rm rm NameOfFileโปรดทราบว่าด้วยฮาร์ดลิงก์ไม่มีความแตกต่างระหว่าง "ไฟล์ต้นฉบับ" และ "ลิงก์ไปยังไฟล์": คุณเพียงแค่มีสองชื่อสำหรับไฟล์เดียวกันและการลบเพียงหนึ่งชื่อจะไม่ลบอีก


2
นอกจากนี้คุณจะต้อง rm เป็น root (ใช้sudo) ถ้าคุณสร้างมันด้วยคำสั่งที่คุณให้ไว้ (ในฐานะผู้ใช้ระดับสูง)
RafałCieślak

3
@ RafałCieślak: ผิด ฮาร์ดลิงก์ทั้งหมดไปยัง inode จะใช้สิทธิ์การเข้าถึงเดียวกันกับ inode ในการลบเช่น "unlink" รายการไดเรกทอรีของไฟล์คุณต้องมีสิทธิ์เขียนใน inode ของไฟล์นั้นและในไดเรกทอรีที่มีรายการที่คุณต้องการลบ ดังนั้นจึงไม่เกี่ยวข้องกับสิทธิ์พิเศษที่ใช้ในการสร้างฮาร์ดลิงก์ สิ่งเหล่านี้อาจเกิดขึ้นกับ (เหมือนเดิม) ในเวลาของการสร้าง
David Foerster

2

ฉันมีสคริปต์นี้เพื่อลบฮาร์ดลิงก์ที่ซ้ำซ้อน แต่ระวัง - มันค่อนข้างอันตราย

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

ที่จริงแล้วrmใช้งานไม่ได้:

[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

unlink AZPสิ่งที่ทำงานเป็น


2
คุณแน่ใจหรือว่าเป็นลิงค์ยาก ฮาร์ดลิงก์เหมือนไฟล์ iirc
เซท

@Seth ที่จริงฉันจำไม่ได้ว่ามันคืออะไร แต่ไม่ต้องการลบอย่างที่คุณเห็น มีคนบอกให้ฉันใช้ยกเลิกการเชื่อมโยงและใช้งานได้ :)
Bunyk

อาจเป็นเพราะ AZP เป็นไฟล์ไม่ใช่ไดเรกทอรี แต่ฉันไม่แน่ใจถ้าไม่มีข้อมูลเพิ่มเติม การยกเลิกการเชื่อมโยงควรใช้งานได้ตลอดเวลาดังนั้นจึงไม่มีปัญหา
เซท

1
AZP/ดูเหมือนไดเรกทอรี rm ไม่ทำงานในไดเรกทอรีที่ไม่มีการตั้งค่าสถานะแบบเรียกซ้ำ ยังเป็นไปตามเอกสาร coreutills >>> ระบบส่วนใหญ่ห้ามทำการเชื่อมโยงไปยังไดเรกทอรีอย่างหนัก ผู้ที่ได้รับอนุญาตมีเพียงผู้ใช้ขั้นสูงเท่านั้นที่สามารถทำได้ (และด้วยความระมัดระวังเนื่องจากการสร้างวัฏจักรจะทำให้เกิดปัญหากับยูทิลิตี้อื่น ๆ )
ThorSummoner

2
ห้ามเชื่อมโยงไปยังไดเรกทอรีอย่างหนัก หากAZPเป็นลิงก์สัญลักษณ์ไปยังไดเรกทอรี (หรืออย่างอื่น) rm AZP/จะไม่ทำงานเพราะrmคิดว่าเป็นไดเรกทอรี (เพราะอยู่/ที่ท้าย) อย่างไรก็ตามrm AZPจะใช้งานได้ดี -1
David Foerster

0

หากคุณต้องการลบเฉพาะลิงก์และเก็บไฟล์ต้นฉบับไว้คุณต้องใช้การยกเลิกการเชื่อมโยง


คุณอ่านอะไรunlink(1)เหรอ? มันเป็น wrapper ตื้น ๆ รอบการunlink(2)เรียกระบบการเรียกระบบเดียวกันที่rm(1)ใช้สำหรับไฟล์ทั้งหมดที่ไม่ได้ไดเรกทอรี
David Foerster

1
คำตอบนี้ทำให้เข้าใจผิด ด้วยไฟล์ฮาร์ดลิงก์ไม่มีความแตกต่างระหว่าง "ลิงก์" และ "ไฟล์ต้นฉบับ"; ฮาร์ดลิงก์ทั้งหมดอ้างถึงไฟล์ / content / inode เดียวกันซึ่งแสดงโดยรายการไดเร็กทอรีที่ต่างกัน unlinkแม้จะเป็นชื่อแล้วมันจะไม่แยกฮาร์ดลิงก์ออกเป็นสองไฟล์แยกกัน แต่จะลบรายการไดเรกทอรี "ไม่ได้ลิงก์" (แต่ไม่ใช่ไฟล์ / เนื้อหา / inode ตราบใดที่จำนวนลิงค์คือ> 1)
เมอร์ฟี
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.