Como faço para excluir um link físico?

23

Recentemente eu criei um link com o seguinte:

sudo ln -n originalFileLocation

Como faço para excluir um link físico?

Hawkeye
fonte
4
FYI: ln -n /path/to/filecria um arquivo nomeado fileno diretório atual e é uma abreviação de ln --no-dereference /path/to/file. Isso significa que, se /path/to/filefor um link simbólico, o novo hardlink criado apontará para esse link simbólico, em vez do destino do link simbólico.
Lekensteyn

Respostas:

37

Você pode excluí-lo com rmas usual: rm NameOfFile. Observe que, nos links físicos, não há distinção entre "o arquivo original" e "o link para o arquivo": você só tem dois nomes para o mesmo arquivo e a exclusão de apenas um nome não excluirá o outro.

Prateek
fonte
2
Além disso, você precisará rm-lo como root (use sudo), se você o criou com o comando que forneceu (como superusuário).
Rafał Cieślak 5/11
3
@ RafałCieślak: Errado. Todos os links físicos para um inode compartilham as mesmas permissões de acesso, as do inode. Para excluir, ou seja, "desvincular", uma entrada de diretório de um arquivo, você precisa de permissões de gravação no inode desse arquivo e no diretório que contém a entrada que deseja excluir. Portanto, é irrelevante quais privilégios foram usados ​​para criar o link físico. Eles podem acontecer (ainda) ser o mesmo que no momento da criação.
David Foerster
2

Eu tenho esse script para remover links físicos redundantes. Mas tome cuidado - é bastante perigoso.

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

Na verdade rmnão 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

O que funciona é unlink AZP.

Bunyk
fonte
2
Tem certeza de que o seu foi um link direto? Os links físicos são como arquivos iirc.
Seth
@ Set, na verdade não me lembro o que foi isso, mas ele não quer remover como você pode ver. Alguém me disse para usar o unlink e funcionou. :)
Bunyk
Provavelmente porque o AZP era um arquivo, não um diretório, mas eu não podia ter certeza sem mais informações. Desvincular sempre deve funcionar, portanto, não há problemas.
Seth
1
AZP/parece um diretório, o rm não opera em diretórios sem o sinalizador recursivo. Também de acordo com os documentos coreutills. >>> A maioria dos sistemas proíbe a criação de um link físico para um diretório; naqueles em que é permitido, apenas o superusuário pode fazê-lo (e com cuidado, pois a criação de um ciclo causará problemas a muitos outros utilitários).
ThorSummoner
2
Links físicos para diretórios são proibidos. Se AZPé um link simbólico para um diretório (ou qualquer outra coisa) rm AZP/não funcionará porque rmpensa que é um diretório (por causa do /no final). No entanto, rm AZPirá funcionar muito bem. -1
David Foerster
0

Se você deseja remover apenas o link e, assim, manter o arquivo original, precisará desvincular.

fbo72
fonte
Você leu o que unlink(1)faz? É um invólucro superficial em torno da unlink(2)chamada do sistema, a mesma chamada de sistema rm(1)usada para todos os arquivos que não são diretórios.
David Foerster
1
Esta resposta é enganosa. Nos arquivos com links físicos, não há distinção entre "link" e "arquivo original"; todos os hardlinks se referem ao mesmo arquivo / conteúdo / inode, representado por diferentes entradas de diretório. unlink, apesar do nome, não separará um link físico em dois arquivos separados, mas removerá a entrada de diretório "desvinculada" (mas não o arquivo / content / inode, contanto que a contagem de links seja> 1).
Murphy