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

sudo apt-get install ubuntu-desktop 

решить проблему.

17
задан 5 November 2011 в 16:17

4 ответа

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

31
ответ дан 25 May 2018 в 17:11
  • 1
    Также вам понадобится rm его как root (используйте sudo), если вы создали его с помощью команды, которую вы предоставили (как суперпользователя). – Rafał Cieślak 5 November 2011 в 17:38
  • 2
    @ RafałCieślak: Неправильно. Все жесткие ссылки на индекс имеют одинаковые права доступа, такие как inode. Чтобы удалить, i. е. «Unlink», запись в каталоге файла, в которой вам нужны права на запись в inode этого файла и в каталоге, который содержит запись, которую вы хотите удалить. Поэтому неуместно, какие привилегии использовались для создания жесткой ссылки. Они могут просто произойти (все равно) быть такими же, как и во время творения. – David Foerster 29 November 2016 в 15:45

У меня есть этот скрипт для удаления избыточных жестких ссылок. Но будьте осторожны - это очень опасно.

#!/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
2
ответ дан 25 May 2018 в 17:11

На самом деле 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.

0
ответ дан 25 May 2018 в 17:11
  • 1
    Вы уверены, что ваша была жесткой ссылкой? Жесткие ссылки похожи на файлы iirc. – Seth♦ 12 March 2014 в 22:59
  • 2
    @Seth, на самом деле я не помню, что это было, но он не хочет удалять, как вы могли видеть. Кто-то сказал мне использовать unlink, и это сработало. :) – Bunyk 27 March 2014 в 03:21
  • 3
    Вероятно, это потому, что AZP был файлом, а не каталогом, но я не мог быть уверен без дополнительной информации. Unlink всегда должен работать, поэтому проблем нет. – Seth♦ 27 March 2014 в 04:19
  • 4
    AZP/ выглядит как каталог, rm не работает с каталогами без рекурсивного флага. Также в соответствии с документами coreutills. & GT; & GT; & GT; Большинство систем запрещают жесткую ссылку на каталог; на тех, где это разрешено, только суперпользователь может это сделать (и с осторожностью, так как создание цикла вызовет проблемы для многих других утилит). – ThorSummoner 24 March 2016 в 21:04
  • 5
    Жесткие ссылки на каталоги запрещены. Если AZP является символической ссылкой на каталог (или что-то еще), rm AZP/ не будет работать, потому что rm думает о своей директории (из-за / в конце). Однако rm AZP будет работать нормально. -1 – David Foerster 29 November 2016 в 15:40

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

0
ответ дан 25 May 2018 в 17:11
  • 1
    Вы читали, что делает unlink(1) ? Это мелкая оболочка вокруг системного вызова unlink(2) , тот же системный вызов, который rm(1) использует для всех файлов, которые не являются каталогами. – David Foerster 29 November 2016 в 15:42
  • 2
    Этот ответ вводит в заблуждение. С жестко привязанными файлами нет никакого различия между «ссылкой». и "исходный файл"; все жесткие ссылки относятся к одному файлу / контенту / индексу, представленному разными записями в каталоге. unlink, несмотря на его имя, не будет разделять жесткосвязанные на два отдельных файла, но удаляет "несвязанные" запись каталога (но не файл / контент / индексный дескриптор, если счетчик ссылок равен & gt; 1). – Murphy 5 May 2017 в 01:29

Другие вопросы по тегам:

Похожие вопросы: