¿Hay una manera sencilla de encontrar todos los archivos dispersos en mi sistema o en un árbol de directorios en particular?
Si es relevante, estoy usando zsh
Ubuntu 12.04, aunque una respuesta Unix-y más genérica para bash / sh, por ejemplo, estaría bien.
Editar : para aclarar, estoy buscando buscar archivos dispersos, no verificar el estado de dispersión de uno solo.
filesystems
files
Andrew Ferrier
fuente
fuente
Respuestas:
En sistemas (y sistemas de archivos) que admiten el
SEEK_HOLE
lseek
indicador (como lo haría su Ubuntu 12.04 en ext4) y suponiendo que el valorSEEK_HOLE
es 4 como en Linux:Esa sintaxis de shell es POSIX. Las cosas no portátiles que contiene son
perl
y esoSEEK_HOLE
.lseek(SEEK_HOLE)
busca el inicio del primer agujero en el archivo, o el final del archivo si no se encuentra ningún agujero. Arriba sabemos que el archivo no es escaso cuandolseek(SEEK_HOLE)
nos lleva al final del archivo (al mismo lugar quelseek(SEEK_END)
).Si desea enumerar los archivos dispersos:
El GNU
find
(desde la versión 4.3.3) tiene-printf %S
que informar la escasez de un archivo. Toma el mismo enfoque que la respuesta de frostschutz, ya que toma la proporción de uso del disco frente al tamaño del archivo, por lo que no se garantiza que informe todos los archivos dispersos (como cuando hay compresión a nivel del sistema de archivos o donde el espacio ahorrado por los agujeros no compensar la sobrecarga de la infraestructura del sistema de archivos o los grandes atributos extendidos), pero funcionaría en sistemas que no tienenSEEK_HOLE
o sistemas de archivos dondeSEEK_HOLE
no se implementa. Aquí con las herramientas de GNU:(tenga en cuenta que una versión anterior de esta respuesta no funcionó correctamente cuando
find
expresó la escasez como, por ejemplo, 3.2e-05. Gracias a la respuesta de @ flashydave por llamar mi atención)fuente
find
también debería excluir directamente los archivos de 0 bytes?find -printf '%S'
! :-)tr
comando conxargs -r0 rm -f
Un archivo generalmente es escaso cuando la cantidad de bloques asignados es menor que el tamaño del archivo (aquí usando GNU
stat
como se encuentra en Ubuntu, pero tenga cuidado con otros sistemas que pueden tener implementaciones incompatiblesstat
).Variante con
find
: (robado de Stephane)Por lo general, debe poner esto en un script de shell, luego ejecutar el script de shell.
fuente
SEEK_HOLE
Sin embargo, es igual de problemático, ya que no es compatible con muchas plataformas / sistemas de archivos. En Linux también podría usarFIEMAP
/FIBMAP
, peroFIBMAP
en particular es terriblemente lento ... simplemente no parece ser una buena manera.for file in *
ofind
. Si puede probar un solo archivo, puede probar todos los archivos ... aunque debe excluir directorios con este método.La respuesta anterior de Stephane Chazelas no tiene en cuenta el hecho de que algunos archivos dispersos con el parámetro find% S informan la relación como números de coma flotante como
Estos se pueden encontrar además de
fuente
Una secuencia de comandos breve que escribí al tratar de averiguar cuáles son las ubicaciones de los agujeros en un archivo:
Esto imprime cosas como:
fuente