Existe uma maneira simples de encontrar todos os arquivos esparsos no meu sistema ou em uma árvore de diretórios específica?
Se for relevante, estou usando zsh
no Ubuntu 12.04, embora uma resposta mais genérica do Unix-y para o bash / sh, por exemplo, esteja bem.
Editar : para esclarecer, estou procurando por arquivos esparsos, não para verificar o status de escassez de um único.
filesystems
files
Andrew Ferrier
fonte
fonte
Respostas:
Em sistemas (e sistemas de arquivos) que suportam a
SEEK_HOLE
lseek
flag (como o Ubuntu 12.04 no ext4 suportaria ) e assumindo que o valor paraSEEK_HOLE
é 4, como no Linux:Essa sintaxe do shell é POSIX. O material não portátil nele é
perl
e aquiloSEEK_HOLE
.lseek(SEEK_HOLE)
procura o início do primeiro furo no arquivo ou o final do arquivo se nenhum buraco for encontrado. Acima, sabemos que o arquivo não é escasso quando noslseek(SEEK_HOLE)
leva ao final do arquivo (no mesmo local quelseek(SEEK_END)
).Se você deseja listar os arquivos esparsos:
O GNU
find
(desde a versão 4.3.3) deve-printf %S
relatar a escassez de um arquivo. Ele segue a mesma abordagem da resposta de frostschutz, na medida em que leva a proporção de uso do disco e tamanho do arquivo, por isso não é garantido que todos os arquivos esparsos sejam reportados (como quando há compressão no nível do sistema de arquivos ou onde o espaço economizado pelos furos não é compensar a sobrecarga da infraestrutura do sistema de arquivos ou grandes atributos estendidos), mas funcionaria em sistemas que não possuemSEEK_HOLE
ou sistemas de arquivos ondeSEEK_HOLE
não são implementados. Aqui com as ferramentas GNU:(observe que uma versão anterior desta resposta não funcionou corretamente quando
find
expressa a escassez como, por exemplo, 3.2e-05. Obrigado à resposta do @ flashydave por chamar a atenção)fonte
find
também deva excluir arquivos de 0 byte diretamente?find -printf '%S'
! :-)tr
comando porxargs -r0 rm -f
Um arquivo geralmente é escasso quando o número de blocos alocados é menor que o tamanho do arquivo (aqui, usando o GNU
stat
como encontrado no Ubuntu, mas cuidado, outros sistemas podem ter implementações incompatíveis destat
).Variante com
find
: (roubado de Stephane)Você normalmente colocaria isso em um script de shell e, em seguida, executaria o script de shell.
fonte
SEEK_HOLE
é tão problemático, pois não é suportado por muitas plataformas / sistemas de arquivos. No Linux, você também pode usarFIEMAP
/FIBMAP
, masFIBMAP
em particular é terrivelmente lento ... simplesmente não parece ser uma boa maneira.for file in *
oufind
. Se você pode testar um único arquivo, pode testar todos os arquivos ... embora seja necessário excluir diretórios com esse método.A resposta de Stephane Chazelas acima não leva em consideração o fato de que alguns arquivos esparsos com o parâmetro find% S relatam a razão como números de ponto flutuante, como
Estes podem ser encontrados em conjunto com
fonte
Um script curto que escrevi enquanto tentava descobrir quais são os locais dos furos em um arquivo:
Isso imprime coisas como:
fonte