Как удалить жесткую ссылку?

23

Недавно я создал ссылку со следующим:

sudo ln -n originalFileLocation

Как удалить жесткую ссылку?

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

Ответы:

37

Вы можете удалить его с rmкак обычно: rm NameOfFile. Обратите внимание, что в случае жестких ссылок нет различий между «исходным файлом» и «ссылкой на файл»: у вас просто два имени для одного и того же файла, и удаление только одного из них не приведет к удалению другого.

Prateek
источник
2
Также отметьте, что вам нужно будет ввести его как root (использовать sudo), если вы создали его с помощью предоставленной вами команды (как суперпользователь).
Rafał Cieślak
3
@ RafałCieślak: Неправильно. Все жесткие ссылки на индексные узлы имеют те же права доступа, что и индексные. Чтобы удалить, т. Е. «Отсоединить», запись каталога в файле, для которого вам нужны разрешения на запись в индекс этого файла и в каталог, содержащий запись, которую вы хотите удалить. Поэтому не имеет значения, какие привилегии были использованы для создания жесткой ссылки. Они могут просто случиться (все еще) так же, как во время создания.
Дэвид Фёрстер
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
xerostomus
источник
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.

Bunyk
источник
2
Ты уверен, что твоя была жесткой ссылкой? Жесткие ссылки похожи на файлы iirc.
Сет
@ Сидит, на самом деле я не помню, что это было, но это не хочет удалять, как вы могли видеть. Кто-то сказал мне использовать unlink, и это сработало. :)
Bunyk
Вероятно, это потому, что AZP был файлом, а не каталогом, но я не мог быть уверен без дополнительной информации. Unlink всегда должен работать, поэтому никаких проблем нет.
Сет
1
AZP/выглядит как каталог, rm не работает с каталогами без рекурсивного флага. Также в соответствии с документами Coreutills. >>> Большинство систем запрещают делать жесткую ссылку на каталог; на тех, где это разрешено, только суперпользователь может сделать это (и с осторожностью, поскольку создание цикла вызовет проблемы для многих других утилит).
ThorSummoner
2
Жесткие ссылки на каталоги запрещены. Если AZPэто символическая ссылка на каталог (или что-то еще) rm AZP/не будет работать, потому что rmсчитает его каталогом (из- /за конца). Однако rm AZPбудет работать просто отлично. -1
Дэвид Фёрстер
0

Если вы хотите удалить только ссылку и, таким образом, сохранить оригинальный файл, вы должны использовать unlink.

fbo72
источник
Вы читали, что unlink(1)делает? Это мелкая оболочка для unlink(2)системного вызова, тот же системный вызов, который rm(1)используется для всех файлов, которые не являются каталогами.
Дэвид Фёрстер
1
Этот ответ вводит в заблуждение. В жестко связанных файлах нет различия между «ссылкой» и «исходным файлом»; все жесткие ссылки относятся к одному и тому же файлу / содержимому / индоду, представленному разными записями каталога. unlink, несмотря на его имя, не будет разделять жесткую ссылку на два отдельных файла, но удалит «несвязанную» запись каталога (но не файл / content / inode, если количество ссылок> 1).
Мерфи