¿Cómo elimino un enlace duro?

23

Recientemente creé un enlace con lo siguiente:

sudo ln -n originalFileLocation

¿Cómo elimino un enlace duro?

ojo de halcón
fuente
44
FYI: ln -n /path/to/filecrea un archivo nombrado fileen el directorio actual y es la abreviatura de ln --no-dereference /path/to/file. Esto significa que si se /path/to/filetrata de un enlace simbólico, el enlace duro recién creado apuntará a ese enlace simbólico en lugar del destino del enlace simbólico.
Lekensteyn

Respuestas:

37

Se puede eliminar con rmcomo de costumbre: rm NameOfFile. Tenga en cuenta que con los enlaces duros no hay distinción entre "el archivo original" y "el enlace al archivo": solo tiene dos nombres para el mismo archivo, y eliminar solo uno de los nombres no eliminará el otro.

Prateek
fuente
2
Además, deberá ejecutarlo como root (usar sudo), si lo creó con el comando que proporcionó (como superusuario).
Rafał Cieślak
3
@ RafałCieślak: Mal. Todos los enlaces duros a un inodo comparten los mismos permisos de acceso que el inodo. Para eliminar, es decir, "desvincular", una entrada de directorio de un archivo, necesita permisos de escritura en el inodo de ese archivo y en el directorio que contiene la entrada que desea eliminar. Por lo tanto, es irrelevante qué privilegios se utilizaron para crear el enlace duro. Es posible que (todavía) sean los mismos que en el momento de la creación.
David Foerster
2

Tengo este script para eliminar enlaces duros redundantes. Pero ten cuidado, es bastante peligroso.

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

En realidad rmno funciona:

[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

Lo que funciona es unlink AZP.

Bunyk
fuente
2
¿Estás seguro de que el tuyo fue un enlace duro? Los enlaces duros son como los archivos de iirc.
Seth
@Seth, en realidad no recuerdo qué fue eso, pero no quiere eliminarlo como puedes ver. Alguien me dijo que usara unlink y funcionó. :)
Bunyk
Probablemente sea porque AZP era un archivo, no un directorio, pero no podía estar seguro sin más información. Sin embargo, Desvincular siempre debería funcionar, así que no hay problemas allí.
Seth
1
AZP/parece un directorio, rm no funciona en directorios sin la bandera recursiva. También de acuerdo con los documentos coreutills. >>> La mayoría de los sistemas prohíben hacer un enlace duro a un directorio; en aquellos donde está permitido, solo el superusuario puede hacerlo (y con precaución, ya que crear un ciclo causará problemas a muchas otras utilidades).
ThorSummoner
2
Los enlaces duros a directorios están prohibidos. Si AZPes un enlace simbólico a un directorio (o cualquier otra cosa) rm AZP/no funcionará porque rmpiensa que es un directorio (debido /al final). Sin embargo rm AZPfuncionará bien. -1
David Foerster
0

Si desea eliminar solo el enlace y, por lo tanto, conservar el archivo original, debe usar unlink.

fbo72
fuente
¿Has leído lo que unlink(1)hace? Es una envoltura poco profunda alrededor de la unlink(2)llamada al sistema, la misma llamada al sistema que se rm(1)usa para todos los archivos que no son directorios.
David Foerster
1
Esta respuesta es engañosa. Con los archivos enlazados no hay distinción entre "enlace" y "archivo original"; todos los enlaces duros se refieren al mismo archivo / contenido / inodo, representado por diferentes entradas de directorio. unlink, a pesar de su nombre, no separará un enlace fijo en dos archivos separados, pero eliminará la entrada del directorio "no vinculado" (pero no el archivo / contenido / inodo, siempre que el recuento de enlaces sea> 1).
Murphy