Como contar separadamente o número de arquivos, diretórios, links simbólicos e hard links dentro de uma única corrida de localização?

1

Para verificar uma migração bem-sucedida, estou usando find para contar o número de arquivos, diretórios, links simbólicos e arquivos com mais de um link físico. Como os diretórios a serem verificados contêm um grande número de arquivos, cada find da execução leva várias horas. Assim, eu pesquiso uma maneira de contar separadamente o número de arquivos, diretórios, links simbólicos e arquivos com mais de um link físico em uma única execução find .

Veja o que eu faço atualmente

num_files=$(find $directory -type f | wc -l)
num_directories=$(find $directory -type d | wc -l)
num_symlinks=$(find $directory -type l | wc -l)
num_hardlinks=$(find $directory -type f -links +1 | wc -l)

Como posso obter esses quatro contadores em um find executado?

    
por Florian Feldhaus 24.07.2013 / 09:06

3 respostas

2

O seguinte deve fazê-lo. Requer GNU find ; no OS X, instale, e. findutil usando o Homebrew.

find $directory -type d -printf d -o -type l -printf l -o -type f -links +1 -printf h -o -type f -printf f

Isso imprimirá um caractere por entrada do sistema de arquivos encontrado:

  • d se for um arquivo
  • l se for um link simbólico
  • h se for um arquivo com links físicos
  • f se for um arquivo (somente se não for h )

A saída se parece com isso (trecho real no meu sistema):

dfddfdfddfdfddfdfddfdfddfdfddfddfdfddfdffffffffddfdffdfffffffffddfdldfllfdlldffffdfllfdlllllldffffdffffldfllfddffdldfddddffffflllldllllldlffffldfllfdlldffffdfllfddffddfddddfffffldfddddfffffdfddddfffffdlllldffffldfffflflllldffflfdffflfdfllfddffffldffffdfffflldfffflllldffffdffffdfffflldfllfddffdldfddddfffffdllllddflfffflldfllfddffffdffffdffffldffffdffffdffffdffffllldffffldffffdffffldffffldffffdffffdffffllllllldffffldffffdfffflllllldfffflldffddldfllfdldfffflldfffflldffffdfffflldffffdffffdfllfdlldfffflllldfllfdlldffffdfllfdlllllldffffdffdldfllfdlldfffflldfffflldffffldffffldfffflldfllfdldffffldffffldffdldffdddffddffddffddldfllfdlldffffdffffdfffflldfffflldffffdffffllldffffdffffdfllfddffffldfffflllldffffldfffflllldffffdfllfddffdldddddfffdddddfffdddddfffdddddfffdldlfffflldlffffllldfffllldffffdlffffdlffffldfffflldffdldfllfdllldffffdffffdffffldfllfdlllldfffflldfllfdldfddffffffl

Redirecione a saída para um arquivo e, em seguida, torna-se o processamento de string simples para contar mais tarde.

    
por 24.07.2013 / 09:22
3
find $directory -type d -exec echo dirs \; -o -type l -exec echo symlinks \; -o -type f -links +1 -exec echo hardlinks \; -o -type f -exec echo files \; | sort | uniq -c

Produz saída como:

 326 dirs
2164 files
  40 hardlinks
 164 symlinks
    
por 24.07.2013 / 15:01
2

Usando o responder de Daniel Beck Eu desenvolvi a seguinte solução que deve funcionar para a maioria das versões de find e também fornece a mágica de contagem:

output=$(find $directory -type d -exec printf d \; -o -type l -exec printf l \; -o -type f -links +1 -exec printf h \; -o -type f -exec printf f \;)
num_files=$(echo $output | grep -o "f" | wc -l)
num_directories=$(echo $output | grep -o "d" | wc -l)
num_symlinks=$(echo $output | grep -o "l" | wc -l)
num_hardlinks=$(echo $output | grep -o "h" | wc -l)
    
por 24.07.2013 / 13:16