Di recente ho creato un collegamento con il seguente:
sudo ln -n originalFileLocation
Come posso eliminare un collegamento reale?
Di recente ho creato un collegamento con il seguente:
sudo ln -n originalFileLocation
Come posso eliminare un collegamento reale?
Risposte:
È possibile eliminare con rm
come 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.
sudo
), se lo hai creato con il comando che hai fornito (come superutente).
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
In realtà rm
non 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
.
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à).
AZP
è un collegamento simbolico a una directory (o qualsiasi altra cosa) rm AZP/
non funzionerà perché rm
pensa che sia una directory (a causa della /
fine). Tuttavia rm AZP
funzionerà bene. -1
Se si desidera rimuovere solo il collegamento e quindi conservare il file originale, è necessario utilizzare scollega.
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.
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).
ln -n /path/to/file
crea un file denominatofile
nella directory corrente ed è una scorciatoia perln --no-dereference /path/to/file
. Ciò significa che se si/path/to/file
tratta di un collegamento simbolico, il collegamento reale appena creato punterà a quel collegamento simbolico anziché alla destinazione del collegamento simbolico.