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.
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=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
Ê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.
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).
ln -n /path/to/file
crée un fichier nomméfile
dans le répertoire courant et est un raccourci pourln --no-dereference /path/to/file
. Cela signifie que si/path/to/file
est un lien symbolique, le lien dur nouvellement créé pointera vers ce lien symbolique au lieu de la cible du lien symbolique.Réponses:
Vous pouvez le supprimer avec
rm
comme 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.la source
sudo
), si vous l'avez créé avec la commande que vous avez fournie (en tant que super-utilisateur).J'ai ce script pour supprimer les liens durs redondants. Mais attention, c'est assez dangereux.
la source
En fait ,
rm
ne fonctionne pas:Ce qui fonctionne, c'est
unlink AZP
.la source
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).AZP
est un lien symbolique vers un répertoire (ou quoi que ce soit d'autre)rm AZP/
ne fonctionnera pas carrm
pense que c'est un répertoire (à cause de/
la fin). Cependant,rm AZP
cela fonctionnera très bien. -1Si vous souhaitez supprimer uniquement le lien et conserver ainsi le fichier d'origine, vous devez utiliser un lien.
la source
unlink(1)
passe? Il s'agit d'un wrapper peu profond autour de l'unlink(2)
appel système, le même appel systèmerm(1)
utilisé pour tous les fichiers qui ne sont pas des répertoires.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).