¿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 zshUbuntu 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_HOLElseekindicador (como lo haría su Ubuntu 12.04 en ext4) y suponiendo que el valorSEEK_HOLEes 4 como en Linux:Esa sintaxis de shell es POSIX. Las cosas no portátiles que contiene son
perly 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 %Sque 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_HOLEo sistemas de archivos dondeSEEK_HOLEno se implementa. Aquí con las herramientas de GNU:(tenga en cuenta que una versión anterior de esta respuesta no funcionó correctamente cuando
findexpresó la escasez como, por ejemplo, 3.2e-05. Gracias a la respuesta de @ flashydave por llamar mi atención)fuente
findtambién debería excluir directamente los archivos de 0 bytes?find -printf '%S'! :-)trcomando conxargs -r0 rm -fUn archivo generalmente es escaso cuando la cantidad de bloques asignados es menor que el tamaño del archivo (aquí usando GNU
statcomo 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_HOLESin 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, peroFIBMAPen 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