Como você conta o número total de hard links em um diretório?

0

Eu tenho tentado usar o -ls e encontrar comandos para totalizar o número de ocorrências de link físico em um diretório.

Existe uma maneira simples de conseguir isso além de contar fisicamente todas as contagens de links > 2 usando o comando ls -li?

    
por lostInCode 06.11.2018 / 01:16

3 respostas

2

com zsh :

(){echo $#} *(NDl+1^/)

Note que não conta . nem .. . Se você não quiser contar diretórios (que, na maioria dos sistemas de arquivos, são sempre links físicos), mude para *(NDl+1) .

  • (){echo $#} função anônima que gera seu número de argumentos
  • *(...) glob com qualificadores glob
  • N : ativar nullglob para esse glob (expandir para nada quando não houver correspondência)
  • D : ativar dotglob para esse glob (inclui arquivos ocultos, mas nunca . nem .. )
  • l+1 : selecione arquivos com um número de links estritamente maior que 1.

Equivalente POSIX:

find .//. ! -name . -prune -links +1 | grep -c //

(adicione um ! -type d após -prune para excluir diretórios).

Ou com ls :

(export LC_ALL=C; ls -Aqn | awk 'NR > 1 && $2 > 1 {n++}; END {print n}')

Para excluir diretórios, adicione && $1 !~ /^d/ após $2 > 1 .

    
por 06.11.2018 / 08:38
2
ls -qAi | awk '{print $1}' | sort | uniq -d | wc -l

Isso conta os inodes que estão duplicados no diretório atual (um de cada, substitua -d por -D para contar todas as ocorrências), portanto não contando hard links onde todos os outros links vivem fora do diretório atual. . e .. são excluídos. Substitua -A por -a para adicioná-los novamente (embora seja muito improvável que eles tivessem links físicos no diretório atual).

Pode haver um caminho mais curto, mas isso é muito ilustrativo.

Sr. Pipe | é seu amigo.

( man também)

Divirta-se!

    
por 06.11.2018 / 01:46
1

Dado o ambiente Linux, você poderia usar o comando stat em cada arquivo e pedir a contagem de links. Você pode decidir se deseja incluir ou excluir arquivos de pontos da contagem com shopt -s dotglob . No loop abaixo, eu intencionalmente pulo diretórios.

shopt -s dotglob
i=0
for f in ./*
do
  [ -d "$f" ] && continue
  if [ $(stat -c %h "$f") -gt 1 ]
  then
    i=$((i+1))
  fi
done

Alternativamente, com o GNU find:

find . -maxdepth 1 \! -type d -links +1 -printf . | wc -c

Solicita que find procure, começando no diretório atual ( . ):

  • somente no diretório atual ( -maxdepth 1 )
  • ignorando diretórios ( ! -type d , onde o ! é escapado do shell)
  • em que o número de links é maior que 1
  • , nesse caso, imprima um período ( . )
  • ... e depois contar o número de períodos emitidos
por 06.11.2018 / 02:57