Comment supprimer un lien dur?

23

Récemment, j'ai créé un lien avec les éléments suivants:

sudo ln -n originalFileLocation

Comment supprimer un lien dur?

oeil de faucon
la source
4
FYI: ln -n /path/to/filecrée un fichier nommé filedans le répertoire courant et est un raccourci pour ln --no-dereference /path/to/file. Cela signifie que si /path/to/fileest un lien symbolique, le lien dur nouvellement créé pointera vers ce lien symbolique au lieu de la cible du lien symbolique.
Lekensteyn

Réponses:

37

Vous pouvez le supprimer avec rmcomme d' habitude: rm NameOfFile. Notez qu'avec les liens physiques, il n'y a pas de distinction entre "le fichier d'origine" et "le lien vers le fichier": vous n'avez que deux noms pour le même fichier, et la suppression d'un seul des noms ne supprimera pas l'autre.

Prateek
la source
2
Notez également que vous devrez le rm en tant que root (utilisation sudo), si vous l'avez créé avec la commande que vous avez fournie (en tant que super-utilisateur).
Rafał Cieślak
3
@ RafałCieślak: Faux. Tous les liens physiques vers un inode partagent les mêmes autorisations d'accès, celle de l'inode. Pour supprimer, c'est-à-dire «dissocier», une entrée de répertoire d'un fichier, vous avez besoin d'autorisations d'écriture sur l'inode de ce fichier et sur le répertoire qui contient l'entrée que vous souhaitez supprimer. Par conséquent, il n'est pas pertinent de savoir quels privilèges ont été utilisés pour créer le lien dur. Ils peuvent simplement être (toujours) les mêmes qu'au moment de la création.
David Foerster
2

J'ai ce script pour supprimer les liens durs redondants. Mais attention, c'est assez dangereux.

#!/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
la source
1

En fait , rmne fonctionne pas:

[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

Ce qui fonctionne, c'est unlink AZP.

Bunyk
la source
2
Êtes-vous sûr que le vôtre était un lien dur? Les liens durs sont comme les fichiers iirc.
Seth
@Seth, en fait, je ne me souviens pas de ce que c'était, mais il ne veut pas le supprimer comme vous pouvez le voir. Quelqu'un m'a dit d'utiliser unlink et cela a fonctionné. :)
Bunyk
C'est probablement parce que AZP était un fichier, pas un répertoire, mais je ne pouvais pas être sûr sans plus d'informations. Unlink devrait toujours fonctionner, donc pas de problème.
Seth
1
AZP/ressemble à un répertoire, rm ne fonctionne pas sur les répertoires sans l'indicateur récursif. Toujours selon les documents de coreutills. >>> La plupart des systèmes interdisent de créer un lien dur vers un répertoire; sur ceux où cela est autorisé, seul le super-utilisateur peut le faire (et avec prudence, car la création d'un cycle causera des problèmes à de nombreux autres utilitaires).
ThorSummoner
2
Les liens physiques vers des répertoires sont interdits. Si AZPest un lien symbolique vers un répertoire (ou quoi que ce soit d'autre) rm AZP/ne fonctionnera pas car rmpense que c'est un répertoire (à cause de /la fin). Cependant, rm AZPcela fonctionnera très bien. -1
David Foerster
0

Si vous souhaitez supprimer uniquement le lien et conserver ainsi le fichier d'origine, vous devez utiliser un lien.

fbo72
la source
Avez-vous lu ce qui se unlink(1)passe? Il s'agit d'un wrapper peu profond autour de l' unlink(2)appel système, le même appel système rm(1)utilisé pour tous les fichiers qui ne sont pas des répertoires.
David Foerster
1
Cette réponse est trompeuse. Avec les fichiers liés en dur, il n'y a pas de distinction entre "lien" et "fichier d'origine"; tous les liens physiques font référence au même fichier / contenu / inode, représenté par différentes entrées de répertoire. unlink, malgré son nom, ne séparera pas un lien fixe en deux fichiers distincts, mais supprimera l'entrée de répertoire "non liée" (mais pas le fichier / contenu / inode, tant que le nombre de liens est> 1).
Murphy