Como remover links físicos no Ubuntu sem perder o arquivo original?

Como remover links físicos no Ubuntu sem perder o arquivo original?

Estou no Ubuntu e uso dropbox. O problema é que tenho alguns problemas de sincronização porque tenho muitos links físicos na minha pasta de imagens.

Como posso remover todos eles com um comando simples SEM perder nenhuma foto? Para um único arquivo, encontrei o comando de fluxo

find /home -xdev -samefile "filename" | xargs rm

Mas não sei como fazer isso para todos os arquivos?

obrigado antecipadamente

Informações sobre meu sistema de arquivos:

Filesystem     Type      Size  Used Avail Use% Mounted on
udev           devtmpfs  7,7G     0  7,7G   0% /dev
tmpfs          tmpfs     1,6G  2,4M  1,6G   1% /run
/dev/nvme0n1p3 ext4      435G  203G  211G  50% /
tmpfs          tmpfs     7,7G  756M  7,0G  10% /dev/shm
tmpfs          tmpfs     5,0M  4,0K  5,0M   1% /run/lock

Responder1

Você pode remover um arquivo desde que haja mais de um link físico para ele; os dados serão removidos quando o último link físico for removido. O número de links pode ser recuperado com stat -c '%h' {file}(*), para que você possa apagar todos os arquivos com mais de um hardlink, algo assim:

for file in *
do
   links=$(stat -c '%h' "$file")
   [[ -f "$file" ]] && [[ $links -gt 1 ]] && rm "$file" 
done

Como eles dizem,no final, haverá apenas um, e o sobrevivente será o último verificado, dependendo da ordem de processamento do diretório, ordem alfabética, etc.

(*) Também aparece na saída de ls -l, mas é mais difícil de analisar...

Responder2

Você pode remover"extra"cópias de todos os arquivos como este:

find /home -xdev -type f -links +1 -delete

mas deve estar ciente de que algumas dessas cópias extras podem estar vinculadas a locais fora/home(e pode parecer estar faltando).

O-links +1diz findpara selecionar apenas os arquivos ( -type f) que possuem mais de um link físico.

Você poderia (com mais trabalho) findimprimir o valor do inode para cada arquivo e classificar o resultado e (com awk) escrever uma lista de arquivos para remover via xargs, mas isso causaria problemas com nomes de arquivos com caracteres especiais (incluindo espaços em branco). Mas seria assim que eliminaria a surpresa quando um arquivo fosse vinculado externamente/home.

Responder3

No Unix/Linux/MacOS, um nome de arquivo em um diretório faz referência a um inode (nó indireto), que é a estrutura no disco querealmenteé o arquivo. Esta associação de um nome com um inode é chamada delink físicoem oposição a umlink virtualisso é essencialmente apenas um arquivo contendo o nome sob o qual o arquivo pode ser encontrado. Os links virtuais podem quebrar se alguma parte do caminho para o arquivo vinculado for renomeada ou removida, enquanto renomear/mover um link físico não afeta os outros.

Assim, não existe um “arquivo original”,todoslinks físicos têm exatamente o mesmo status. O inode registra quantos links físicos se referem ao arquivo ( ls -lmostra esse número como o segundo campo; geralmente é 1 para arquivos - apenas um link - e 2 para diretórios - o link no pai e '.' no pai próprio diretório; se houver subdiretórios, cada um se refere ao seu pai via '..' e assim a contagem aumenta). O espaço usado pelo arquivo é recuperado quando a contagem de links chega a 0.

informação relacionada