Como listar uma amostra de arquivos de um diretório

5

Eu tenho um diretório que contém centenas de milhares de arquivos.
Eu preciso listar a amostra desses arquivos (exemplo 10 arquivos), sem processar todos os arquivos encontrados no diretório, o que levará muito tempo de processamento.

    
por WAEL 13.07.2012 / 09:16

1 resposta

1

Eu não acho que você possa fazer uma amostra de toda a lista de arquivos sem lê-los todos de uma forma ou outra, mesmo no nível do sistema de arquivos.

A menos que seus nomes sigam um padrão que é (por exemplo, fileXXXXXXX), caso em que você pode pré-gerar uma lista aleatória de nomes antes de acessar os arquivos. Para uma quantidade tão grande de arquivos, seria estranho se seus nomes fossem aleatórios.

Mas vamos supor que você não tenha essa sorte. Usar find é preferível a ls , pois pode escapar da saída com nulo, tornando-a imune a caracteres fora do padrão em nomes de arquivos. Se não quisermos ler todos os arquivos, é o mais rápido para usar os arquivos no início da listagem. Para obter uma amostra melhor, eu usaria uma amostra maior primeiro ( $oversamplesize abaixo) e faria uma subseção aleatória do tamanho $samplesize a partir dali. Eu não consegui fazer com que sort -R ou shuf funcionem bem com os separadores de nulos, então o embaralhamento e a seleção final são feitos por awk :

 find ~ -type f -print0 | 
 grep --null --null-data -m ${oversamplesize:-100} . | 
 awk -v samplesize=${oversamplesize:-11} -vRS='
 find ~ -type f -print0 | 
 grep --null --null-data -m ${oversamplesize:-100} . | 
 awk -v samplesize=${oversamplesize:-11} -vRS='%pre%' -vORS='%pre%' \
   '{ a[NR]=$0 } END {srand(); while (i<samplesize) { b=(int(rand()*10000)%samplesize); if (b in c) {continue;} else {c[b]=a[b]; print a[b]; i++;} }; }' | 
 xargs -0 echo # echo here being just a dummy
' -vORS='%pre%' \ '{ a[NR]=$0 } END {srand(); while (i<samplesize) { b=(int(rand()*10000)%samplesize); if (b in c) {continue;} else {c[b]=a[b]; print a[b]; i++;} }; }' | xargs -0 echo # echo here being just a dummy

Duas notas aqui. Por alguma razão, muitas vezes também imprime um nome de arquivo vazio, então eu aumentei o tamanho da amostra apenas no caso. A nota trivial é não esquecer de mudar o caminho de busca (~ aqui) e o comando final.

    
por 13.07.2012 / 13:54

Tags