Determinando o número de arquivos em um diretório sem contá-los

4

Relacionados: Qual é a melhor maneira de contar o número de arquivos em um diretório?

Eu tenho um sistema com um grande número de arquivos em um diretório

 $ ls -god xml
 drwxrwsrwx   7 7070720 Mar 12 11:51 xml

Se eu tentar contar grupos específicos de arquivos usando ls xml/*query | wc -l , o sistema geralmente produz uma mensagem de erro

 /bin/ls: arg list too long

Eu tentei find xml -name '*query' | wc -l não houve resposta após 10 minutos, quando terminei o comando.

$ nohup time find xml -name '*query' -level 0 | wc -l &
[1]     11751

$ ps -f 2>rgb
     UID   PID  PPID  C    STIME     TTY        TIME CMD
     rgb 11751 10637  0 02:45:11  ttyp12    00:00:00 wc -l
     rgb 11752 11751  0 02:45:11  ttyp12    00:00:00 time find xml -name *query -level 0
     rgb 11753 11752 77 02:45:11  ttyp12    00:00:03 find xml -name *query -level 0
     rgb 11776 10637  1 02:45:17  ttyp12    00:00:00 ps -f
     rgb 10583 10581  0 02:30:13  ttyp12    00:00:00 -csh
     rgb 10637 10583  2 02:30:19  ttyp12    00:00:00 ksh

top -Urgb

last pid: 11864;  load averages:  1.21,  0.82,  0.66                   14:48:03
249 processes: 246 sleeping, 2 running, 1 onproc
CPU states:  0.0% idle, 24.5% user, 75.5% system,  0.0% wait,  0.0% sxbrk
Memory: 2048M phys, 1799M max, 1718M free, 1774M locked, 114M unlocked, K swap

  PID USERNAME PRI NICE   SIZE   RES  STATE   TIME  COMMAND
11837 rgb       26    0   804K   804K onpr    0:00  top
11753 rgb       56    4  5512K  5512K run     1:10  find
11751 rgb       51    4   588K   588K sleep   0:00  wc
10583 rgb       48    0  1204K  1204K sleep   0:00  -csh
11752 rgb       48    4   588K   588K sleep   0:00  time
10637 rgb       48    0  1288K  1288K sleep   0:00  ksh

last pid: 12330;  load averages:  1.82,  1.45,  1.05                   14:58:06
258 processes: 253 sleeping, 4 running, 1 onproc
CPU states:  0.0% idle, 20.7% user, 78.7% system,  0.6% wait,  0.0% sxbrk
Memory: 2048M phys, 1799M max, 1711M free, 1774M locked, 106M unlocked, K swap

  PID USERNAME PRI NICE   SIZE   RES  STATE   TIME  COMMAND
11837 rgb       26    0   804K   804K onpr    0:00  top
11753 rgb       -1    4  5512K  5512K run     5:10  find
11751 rgb       51    4   588K   588K sleep   0:00  wc
10583 rgb       48    0  1204K  1204K sleep   0:00  -csh
11752 rgb       48    4   588K   588K sleep   0:00  time
10637 rgb       48    0  1288K  1288K sleep   0:00  ksh

$ jobs
[1] +  Running                 nohup time find xml -name '*query' -level 0 | wc -l &

$ kill %1
[1] + Terminated               nohup time find xml -name '*query' -level 0 | wc -l &

Posso, em vez disso, o número de arquivos, digamos, 10%, do tamanho 7070720 do diretório dado por ls -god xml ?

Suplementar Q: Até que ponto isso depende do sistema de arquivos (UFS, V7FS, HTFS etc etc)?

Atualização:

O comando ls xml | wc -l retornou um valor em alguns segundos. Eu deveria ter tentado isso antes de postar a pergunta. Isso fornece as informações que eu estava pedindo, portanto, não há sentido em calcular quantas entradas filename + inode cabem em um diretório de 7070720 bytes (resposta: pelo menos 260085).

    
por RedGrittyBrick 12.03.2013 / 13:06

4 respostas

4

ls desperdiça recursos classificando a saída. Se você tem o GNU ls , faça isso:

ls --quoting-style=escape -U xml | wc -l
    
por 12.03.2013 / 13:47
1
n=0; for file in ./*; do let "n += 1"; done; echo $n;
    
por 12.03.2013 / 15:47
1

set -- *
echo $#

trabalho? Como set é um shell integrado, ele pode não ser afetado pelo limite de arg. Observe que isso ignora os arquivos de ponto. Com um globo mais seletivo, você pode obter exatamente o que precisa. A beleza disso é que não requer um único garfo ou tubo.

    
por 12.03.2013 / 16:42
0

Que tal este comando que canaliza a listagem de dirs não ordenadas e conta correspondências:

$ ls -U ./xml/ | grep -c 'query$'

Observe que, dependendo do seu sabor de * nix, talvez você queira ls -u em vez de ls -U

    
por 11.09.2013 / 01:05

Tags