Як видалити жорстке посилання?


23

Нещодавно я створив посилання з наступним:

sudo ln -n originalFileLocation

Як видалити жорстке посилання?


4
FYI: ln -n /path/to/fileстворює файл, названий fileу поточному каталозі, і це скорочений текст ln --no-dereference /path/to/file. Це означає, що якщо /path/to/fileсимволічне посилання, щойно створене тверде посилання вкаже на це символьне посилання замість цілі символьного посилання.
Лекенштейн

Відповіді:


37

Ви можете видалити його з rmяк зазвичай: rm NameOfFile. Зауважте, що при жорстких посиланнях немає різниці між "вихідним файлом" та "посиланням на файл": у вас є лише два імені для одного файлу, а видалення лише одного з імен не видалить інше.


2
Також зауважте, вам потрібно буде запустити його як root (використання sudo), якщо ви створили його за допомогою вказаної вами команди (як суперкористувача).
Rafał Cieślak

3
@ RafałCieślak: Неправильно. Всі жорсткі посилання на inode мають ті ж дозволи доступу, що і inode. Щоб видалити, тобто "від’єднати", запис у каталог файлу, вам потрібні дозволи на запис на inode цього файлу та в каталог, який містить запис, який ви хочете видалити. Тому не має значення, які привілеї використовувались для створення жорсткого зв'язку. Вони можуть просто траплятися так само, як і під час створення.
Девід Фоерстер

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, насправді я не пам'ятаю, що це було, але він не хоче видаляти, як ви могли бачити. Хтось сказав мені використовувати від’єднання, і це спрацювало. :)
Буник

Це, мабуть, тому, що AZP - це файл, а не каталог, але я не міг бути впевнений без додаткової інформації. Від’єднання завжди має працювати, тому проблем там немає.
Сет

1
AZP/схоже на каталог, rm не працює в каталогах без рекурсивного прапора. Також згідно з документами про Coreutills. >>> Більшість систем забороняє робити жорстке посилання на каталог; на тих, де це дозволено, лише суперкористувач може це зробити (і з обережністю, оскільки створення циклу спричинить проблеми для багатьох інших утиліт).
ThorSummoner

2
Жорсткі посилання на каталоги заборонені. Якщо AZPсимволічне посилання на каталог (або що-небудь інше) rm AZP/не буде працювати, тому що rmвважає його каталогом (через /кінець). Однак rm AZPбуде добре працювати. -1
Девід Фоерстер

0

Якщо ви хочете видалити лише посилання і таким чином зберегти початковий файл, вам доведеться скористатися від’єднанням.


Ви читали, що unlink(1)робить? Це неглибока обгортка навколо unlink(2)системного виклику, той самий системний виклик, який rm(1)використовується для всіх файлів, які не є каталогами.
Девід Фоерстер

1
Ця відповідь вводить в оману. У файлах із твердим посиланням немає різниці між "посиланням" та "оригінальним файлом"; всі тверді посилання посилаються на один і той же файл / вміст / inode, представлений різними записами каталогів. unlink, незважаючи на своє ім'я, не розділить жорстке посилання на два окремі файли, але видалить запис "відключеного" каталогу (але не файл / вміст / індекція, якщо кількість посилань становить> 1).
Мерфі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.