
Estou tentando há horas descobrir isso, mas parece que não consigo fazer isso
Minha pergunta é: tenho um nome de arquivo fácil e há 4 subdiretórios diferentes nele
agora o que preciso fazer é excluir tudo em foo (incluindo links físicos) e recuperar todo o espaço em disco de foo.
Tentei remover todo o arquivo digitando.
rm foo/*
mas não remove os links físicos que estão nos outros subdiretórios.
Então tentei ver se os inodes correspondentes
encontre foo -type f -ls | organizar
e foi isso que consegui com este comando
este comando não mostra os outros subdiretórios apenas foo/
alguém por favor pode me ajudar. Obrigado.
Responder1
Se você deseja excluir todos os arquivos vinculados a qualquer um dos arquivos encontrados por meio de descendente foo
, com ferramentas GNU, você pode fazer:
dir=foo
mountpoint=$(df --output=target -- "$dir" | tail -n +2)
awk -v RS='\0' -v ORS='\0' '
ARGIND == 1 {inum[$0]; next}
{i=$0; getline}
i in inum
' <(find -- "$dir" -xdev ! -type d -links +1 -printf '%i\0') \
<(find -- "$mountpoint" -xdev ! -type d -printf '%i\0%p\0') |
xargs -r0 rm -f
rm -rf -- "$dir"
Isso pressupõe GNU df
, GNU awk
, GNU find
e um shell como o shell GNU ( bash
) que suporta substituição de processo ( <(...)
).
Isso também pressupõe $dir
que não comece -
ou não seja um find
predicado (como !
, (
...).
Acima, procuramos arquivos $dir
aos quais todo o sistema de arquivos pertence. Você pode substituir $mountpoint
apenas pelo diretório pai de $dir
( .
neste caso) ou outrosubdiretórios( 123 ABC def
aqui) se você souber que todos os hardlinks estão apenas lá.
No código acima, registramos os números de inode de todos os arquivos que não são de diretório com uma contagem de links maior que 1 que são encontrados via descendente $dir
. E procure esses números de inode em todo o sistema de arquivos (pelo menos seções dele que não são mascaradas por outros sistemas de arquivos e que você tem permissão para percorrer). os números de inode são exclusivos apenas por sistema de arquivos, portanto, usamos -xdev
para garantir que verificamos apenas o sistema de arquivos $dir
encontrado.
Responder2
rm -rf foo
rm
- remova arquivos ou diretórios.
-f
ignore arquivos e argumentos inexistentes, nunca solicite.-r
remova diretórios e seu conteúdo recursivamente.