Come posso eliminare un collegamento reale?


23

Di recente ho creato un collegamento con il seguente:

sudo ln -n originalFileLocation

Come posso eliminare un collegamento reale?


4
Cordiali saluti: ln -n /path/to/filecrea un file denominato filenella directory corrente ed è una scorciatoia per ln --no-dereference /path/to/file. Ciò significa che se si /path/to/filetratta di un collegamento simbolico, il collegamento reale appena creato punterà a quel collegamento simbolico anziché alla destinazione del collegamento simbolico.
Lekensteyn,

Risposte:


37

È possibile eliminare con rmcome al solito: rm NameOfFile. Si noti che con i collegamenti reali non esiste alcuna distinzione tra "il file originale" e "il collegamento al file": si hanno solo due nomi per lo stesso file e l'eliminazione di uno solo dei nomi non cancellerà l'altro.


2
Inoltre dovrai averlo come root (usa sudo), se lo hai creato con il comando che hai fornito (come superutente).
Rafał Cieślak,

3
@ RafałCieślak: sbagliato. Tutti gli hard link a un inode condividono le stesse autorizzazioni di accesso, quella dell'inode. Per eliminare, ovvero "scollegare", una voce della directory di un file, è necessario disporre delle autorizzazioni di scrittura sull'inode di quel file e sulla directory che contiene la voce che si desidera eliminare. Pertanto è irrilevante quali privilegi sono stati utilizzati per creare il collegamento reale. Possono capitare di essere (ancora) gli stessi del momento della creazione.
David Foerster,

2

Ho questo script per rimuovere i collegamenti reali ridondanti. Ma fai attenzione: è abbastanza pericoloso.

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

In realtà rmnon funziona:

[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

Ciò che funziona è unlink AZP.


2
Sei sicuro che il tuo fosse un collegamento reale? I collegamenti reali sono proprio come i file iirc.
Seth,

@Seth, in realtà non ricordo cos'era quello, ma non vuole rimuoverlo come puoi vedere. Qualcuno mi ha detto di usare unlink e ha funzionato. :)
Bunyk,

Questo probabilmente perché AZP era un file, non una directory, ma non potevo esserne sicuro senza ulteriori informazioni. Unlink dovrebbe sempre funzionare, quindi non ci sono problemi.
Seth,

1
AZP/sembra una directory, rm non funziona su directory senza il flag ricorsivo. Anche secondo i documenti di coreutills. >>> La maggior parte dei sistemi proibisce di creare un collegamento reale a una directory; su quelli dove è consentito, solo il superutente può farlo (e con cautela, poiché la creazione di un ciclo causerà problemi a molte altre utilità).
ThorSummoner,

2
I collegamenti diretti alle directory sono vietati. If AZPè un collegamento simbolico a una directory (o qualsiasi altra cosa) rm AZP/non funzionerà perché rmpensa che sia una directory (a causa della /fine). Tuttavia rm AZPfunzionerà bene. -1
David Foerster,

0

Se si desidera rimuovere solo il collegamento e quindi conservare il file originale, è necessario utilizzare scollega.


Hai letto cosa unlink(1)fa? È un wrapper superficiale attorno alla unlink(2)chiamata di sistema, la stessa chiamata di sistema che rm(1)utilizza per tutti i file che non sono directory.
David Foerster,

1
Questa risposta è fuorviante. Con i file hardlink non c'è distinzione tra "link" e "file originale"; tutti gli hardlink si riferiscono allo stesso file / contenuto / inode, rappresentato da voci di directory diverse. unlink, nonostante il nome, non separerà un hardlink in due file separati, ma rimuoverà la voce di directory "non collegata" (ma non il file / contenuto / inode, purché il conteggio dei collegamenti sia> 1).
Murphy,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.