Se você deseja excluir todos os arquivos com link de hardware para qualquer um dos arquivos encontrados por meio da descendente foo
, com as ferramentas GNU, você pode fazer:
dir=foo
mountpoint=$(df --output=target -- "$dir" | tail -n +2)
awk -v RS='dir=foo
mountpoint=$(df --output=target -- "$dir" | tail -n +2)
awk -v RS='%pre%' -v ORS='%pre%' '
ARGIND == 1 {inum[$0]; next}
{i=$0; getline}
i in inum
' <(find -- "$dir" -xdev ! -type d -links +1 -printf '%i%pre%') \
<(find -- "$mountpoint" -xdev ! -type d -printf '%i%pre%%p%pre%') |
xargs -r0 rm -f
rm -rf -- "$dir"
' -v ORS='%pre%' '
ARGIND == 1 {inum[$0]; next}
{i=$0; getline}
i in inum
' <(find -- "$dir" -xdev ! -type d -links +1 -printf '%i%pre%') \
<(find -- "$mountpoint" -xdev ! -type d -printf '%i%pre%%p%pre%') |
xargs -r0 rm -f
rm -rf -- "$dir"
Isso pressupõe% GNUdf
, GNU awk
, GNU find
e um shell como o shell GNU ( bash
) que suporta a substituição de processos ( <(...)
).
Isso também pressupõe que $dir
não comece com -
ou que não seja um predicado find
(como !
, (
...).
Acima nós procuramos por arquivos em todo o sistema de arquivos $dir
pertence a. Você pode substituir $mountpoint
apenas pelo diretório pai de $dir
( .
neste caso) ou pelos outros subdiretórios ( 123 ABC def
here) se você souber que todos os hardlinks estão 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 por meio de descendente $dir
. E procure por 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ões para percorrer). Os números de inode são únicos por sistema de arquivos, então usamos -xdev
para ter certeza de que só verificamos o único sistema de arquivos $dir
encontrado.