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.
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=1if[ a$1 =="a-R"];then recursive=" -R ";fifor i in $(ls -i $recursive | awk '{print $1}'| uniq --repeated | sort);do
echo "Inode with multiple hardlinked files: $i"
first=1for foundfile in $(find .-xdev -inum $i);doif[ $first ==1];then
echo " preserving the first file: $foundfile"
first=0else
echo " deleting the redundant file: $foundfile"#rm $foundfile fidoneif[ $ask ==1];then
read -p "Delete all the rest of redundant hardlinks without asking? y/N "if[ a${REPLY,,}=="ay"];then ask=0;fifi# read -p "pause for sure"
echo
done
echo "All redundant hardlins are removed."
echo
¿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.
¿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).
ln -n /path/to/file
crea un archivo nombradofile
en el directorio actual y es la abreviatura deln --no-dereference /path/to/file
. Esto significa que si se/path/to/file
trata 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.Respuestas:
Se puede eliminar con
rm
como 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.fuente
sudo
), si lo creó con el comando que proporcionó (como superusuario).Tengo este script para eliminar enlaces duros redundantes. Pero ten cuidado, es bastante peligroso.
fuente
En realidad
rm
no funciona:Lo que funciona es
unlink AZP
.fuente
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).AZP
es un enlace simbólico a un directorio (o cualquier otra cosa)rm AZP/
no funcionará porquerm
piensa que es un directorio (debido/
al final). Sin embargorm AZP
funcionará bien. -1Si desea eliminar solo el enlace y, por lo tanto, conservar el archivo original, debe usar unlink.
fuente
unlink(1)
hace? Es una envoltura poco profunda alrededor de launlink(2)
llamada al sistema, la misma llamada al sistema que serm(1)
usa para todos los archivos que no son directorios.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).